Уменьшение циклов в Python невозможно?

96

Я могу ошибаться (просто дайте мне знать, и я удалю вопрос), но кажется, что python не отвечает на

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

Я пробовал использовать xrange, и это тоже не сработало. Как я могу это реализовать?

Гал
источник
Вы из любопытства используете это для чего-нибудь? Такая функциональность редко требуется!
Katriel
@katrielalex Я использую его для перебора матрицы справа налево. Вы предлагаете мне сделать это по-другому?
Gal
Вы можете попробовать, for i in reversed(mat):хотя это может быть медленнее
Катриэль
Пожалуйста, взгляните на Распечатать список в обратном порядке с диапазоном , он предлагает другую полезную информацию.
RF
1
Пожалуйста, посмотрите Распечатайте список в обратном порядке с диапазоном , принятый ответ очень четко объясняет это.
RF

Ответы:

230
for n in range(6,0,-1):
    print n
# prints [6, 5, 4, 3, 2, 1]
Стив Тхоа
источник
20
Betcha OP действительно хотел range(5,-1,-1). Хотя, наверное, он мог понять это методом проб и ошибок.
kojiro
43

Это очень поздно, но я просто хотел добавить, что есть более элегантный способ: использовать 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
Спасибо, @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)?
Abhijit Sarkar
13
for n in range(6,0,-1)

Это даст вам 6,5,4,3,2,1

Что касается

for n in reversed(range(0,6))

дал бы вам 5,4,3,2,1,0

Хэнди Йодана
источник
2

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

for number in reversed(range(0,10,1)):
print number;
Нео
источник
1

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

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)

SREERAG R NANDAN
источник