Сообщить об ошибке.

Числовые последовательности для цикла Python

Запуск for/in произвольное число раз в Python

Если вам нужно перебрать последовательность чисел, в этом вам поможет встроенная функция range(). Эта функция генерирует арифметические прогрессии:

>>> for i in range(5):
...     print(i)
...
0
1
2
3
4
>>>

В примере выше, указанный аргумент range() число 5 - конечная точка, никогда не является частью сгенерированной последовательности. Например, range(10) генерирует 10 значений, для элементов последовательности длиной 10, проще для понимания от 0 до 9. В классе range() можно менять диапазон, указывая начальное значение, отличное от 0 или указать другое приращение последовательности (задать "шаг"), даже отрицательное:

range(5, 10)
   5, 6, 7, 8, 9

range(0, 10, 3)
   0, 3, 6, 9

range(-10, -100, -30)
  -10, -40, -70

Чтобы перебрать индексы последовательности, можно комбинировать range() и len() следующим образом:

>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb
>>>

В большинстве таких случаев удобно использовать функцию enumerate().

Во многих отношениях возвращаемый объект range() ведет себя так, как будто это список, но на самом деле range() не создает список. Это объект, который возвращает элементы желаемой последовательности, только в момент итерации по нему, тем самым экономя оперативную память.

>>> list(range(4))
[0, 1, 2, 3]
>>>

Бесконечный цикл for/in в Python

Существует общая схема для запуска бесконечных циклов, реализованная в терминах while True:. В определенных ситуациях в этих циклах трудно определить место для выхода из цикла (break) из-за используемой внутри него логики.

Шаблон с бесконечным циклом for использует бесконечный итератор iter(int, 1):

for i, _ in enumerate(iter(int, 1)):
    print(i)

Прервать его можно сочетанием клавиш Ctrl + c.

Обратите внимание, использование ключевого слова break полностью выйдет из цикла, как только встретится, и пропустит оставшуюся часть кода в цикле. А что, если такое поведение недопустимо, и код внутри цикла должен отработать до конца, при этом использование "флагов выхода" из цикла нежелательно.

Идея остановки циклов с учетом того, что код внутри цикла должен выполнятся до конца лежит в использовании генератора и его метода .close() вместо ключевого слова break:

import random

# создаем бесконечный генератор
infinity = (_ for _ in iter(int, 1))
# итерируемся по генератору
for _ in infinity:
    print("v")
    if random.random() < 0.05:
        # закрываем генератор (выходим)  
        infinity.close()
        # при этом код текущей итерации выполниться до конца
        print("Цикл `for` был отменен")

Вызов метода генератора .close(), предотвратит следующую итерацию, но завершит выполнение кода текущей итерации.

Примечание. Метод .close() можно использовать с любым генератором, при этом он не обязательно должен быть бесконечным.