Зменшення циклів у Python неможливо?


94

Я можу помилитися (просто повідомте мене, і я видалю питання), але, здається, python не відповість

for n in range(6,0):
    print n

Я спробував використовувати xrange, і він теж не працював. Як я можу це реалізувати?


З цікавості ви використовуєте це для чого-небудь? Досить рідко потрібна ця функціональність!
Катріель

@katrielalex Я використовую його для перебору матриці справа наліво. чи є інший спосіб, яким ви пропонуєте мені це зробити?
Gal

ви можете спробувати, for i in reversed(mat):хоча це може бути повільніше
Катріель

Будь ласка, подивіться на Друк списку в зворотному порядку з діапазоном. Він пропонує деяку іншу корисну інформацію.
РФ

1
Будь ласка, подивіться Друкуйте список у зворотному порядку з діапазоном , прийнята відповідь це дуже чітко пояснює.
РФ

Відповіді:


217
for n in range(6,0,-1):
    print n
# prints [6, 5, 4, 3, 2, 1]

20
Betcha OP насправді хотів range(5,-1,-1). Хоча він, напевно, міг це зрозуміти за допомогою спроб і помилок.
Коджіро

42

Це дуже пізно, але я просто хотів додати, що є більш елегантний спосіб: використання reversed

for i in reversed(range(10)):
    print i

дає:

4
3
2
1
0

1
Що в цьому елегантного? Ви витрачаєте час на перегляд списку, замість того, щоб створювати його так, як вам хочеться.
alexis

5
@alexis це нічого не коштує. Ви отримуєте reversed(range)безкоштовно завдяки приємній range_reverseоптимізації, вбудованій в CPython. Я зробив кілька швидких тестів і не зміг знайти істотну різницю вартості між step=-1і reversed()в обох Python 2.7 і 3.3. Також зверніть увагу, що ця ідіома використовується у heapq .
Коджіро

Дякую, @kojiro, це цікаво. Але якщо ви не використовували xrangeсвої тести на Python 2.7, reverseвони працюватимуть на звичайному, вже створеному списку, а не на об'єкті діапазону; отже, ви хочете сказати, що будь-який список можна ефективно змінити, або просто range/xrangeоб’єкти? (код heapq, на який ви посилаєтесь, включає об'єкт діапазону Python 3).
alexis

@alexis Я б не був настільки сміливим, щоб припустити, що будь-який список можна ефективно змінити - це занадто некваліфіковане твердження, щоб я все одно міг відповісти. Це говорить, однак, що heapify код змінюється від step=-1до reversed()між Python 2.3 і 2.4
Кодзіро

1
reversed(range(10))не вдається вивести 4через 0. Можливо, ви мали на увазі range(5)?
Абхіджіт Саркар




2

0 - умовне значення, якщо ця умова істинна, цикл буде продовжувати виконуватися. 10 - початкове значення. 1 - це модифікатор, де може бути простий декремент.

for number in reversed(range(0,10,1)):
print number;

1

Пізно на вечірку, але для тих, кому доручено створити власну або хоче побачити, як це буде працювати, ось функція з додатковим бонусом щодо перестановки значень старт-стоп на основі бажаного приросту:

def RANGE(start, stop=None, increment=1):
    if stop is None:
        stop = start
        start = 1

    value_list = sorted([start, stop])

    if increment == 0:
        print('Error! Please enter nonzero increment value!')
    else:
        value_list = sorted([start, stop])
        if increment < 0:
            start = value_list[1]
            stop = value_list[0]
            while start >= stop:
                worker = start
                start += increment
                yield worker
        else:
            start = value_list[0]
            stop = value_list[1]
            while start < stop:
                worker = start
                start += increment
                yield worker

Негативний приріст:

for i in RANGE(1, 10, -1):
    print(i)

Або зі зворотним запуском-зупинкою:

for i in RANGE(10, 1, -1):
    print(i)

Вихід:

10
9
8
7
6
5
4
3
2
1

Регулярне збільшення:

for i in RANGE(1, 10):
    print(i)

Вихід:

1
2
3
4
5
6
7
8
9

Нульове збільшення:

for i in RANGE(1, 10, 0):
    print(i)

Вихід:

'Error! Please enter nonzero increment value!'

0

Для python3 де -1вкажіть значення, яке потрібно зменшувати на кожному кроці for n in range(6,0,-1): print(n)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.