Если вам нужно перебрать последовательность чисел, в этом вам поможет встроенная функция 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()
можно использовать с любым генератором, при этом он не обязательно должен быть бесконечным.