Циклы for в Python
Узнайте, как работают циклы for в Python: синтаксис, range(), enumerate(), break, continue, else, вложенные циклы и перебор списков, строк и словарей.
Цикл for в Python перебирает каждый элемент последовательности — списка, кортежа, строки, словаря, множества или любого другого итерируемого объекта — и выполняет блок кода по одному разу для каждого элемента. В отличие от языков, где for обычно считает числа, цикл for в Python — это цикл for-each, который напрямую проходит по элементам.
В этой главе рассматриваются:
- Базовый синтаксис и принцип работы переменной цикла
- Функция
range()для циклов с подсчётом итераций break,continueи блокelseenumerate()иzip()для более гибкого перебора- Перебор строк, словарей и вложенных структур
- Вложенные циклы
for - Оператор
passкак заглушка
Базовый синтаксис
for variable in iterable:
# block executed once per itemvariable присваивается каждый следующий элемент из iterable. Блок с отступом выполняется один раз для каждого элемента.
Перебор списка
Вывод:
apple
banana
cherryЦикл присваивает "apple" переменной fruit, выполняет print(fruit), затем переходит к "banana" и так далее, пока все элементы не будут перебраны.
Перебор строки
Строка сама по себе является итерируемым объектом — каждый символ является элементом:
for ch in "Python":
print(ch)Вывод:
P
y
t
h
o
nФункция range()
range() генерирует последовательность целых чисел по мере необходимости. Это наиболее распространённый способ запустить цикл заданное количество раз.
range(stop)
range(start, stop)
range(start, stop, step)| Параметр | По умолчанию | Значение |
|---|---|---|
start | 0 | Начальное значение (включительно) |
stop | обязательный | Верхняя граница (не включается) |
step | 1 | Шаг между значениями |
Подсчёт от 1 до 5
Вывод:
1
2
3
4
5range(1, 6) порождает 1, 2, 3, 4, 5 — значение 6 (граница stop) не включается.
Перебор с шагом
for i in range(0, 10, 2):
print(i)Вывод:
0
2
4
6
8Обратный счёт
Отрицательный шаг выполняет перебор в обратном порядке:
for i in range(10, 0, -2):
print(i)Вывод:
10
8
6
4
2Оператор break
break немедленно завершает цикл, до того как будут перебраны все элементы.
for i in range(1, 6):
if i == 3:
break
print(i)Вывод:
1
2Как только i становится равным 3, срабатывает break и цикл останавливается — 3, 4 и 5 никогда не выводятся.
Когда использовать break: поиск по списку с остановкой при нахождении совпадения; досрочный выход из длительного вычисления.
Оператор continue
continue пропускает оставшуюся часть текущей итерации и сразу переходит к следующему элементу.
for i in range(1, 6):
if i == 3:
continue
print(i)Вывод:
1
2
4
5Когда i равно 3, continue пропускает print(i) и переходит к i = 4.
Блок else
Цикл for в Python поддерживает необязательный блок else, который выполняется только если цикл завершился нормально (то есть не был прерван оператором break).
for i in range(1, 4):
print(i)
else:
print("Loop finished")Вывод:
1
2
3
Loop finishedЕсли цикл завершился через break, блок else пропускается:
for i in range(1, 6):
if i == 3:
break
print(i)
else:
print("Loop finished without break")Вывод:
1
2Блок else удобен для сигнализирования об успехе поиска — если вы делаете break при нахождении совпадения, блок else выполняется только тогда, когда совпадение не найдено.
enumerate() — цикл с индексом и значением
enumerate() связывает каждый элемент с его позиционным индексом, так что вы получаете и то, и другое в одном цикле без отдельной переменной-счётчика.
colors = ["red", "green", "blue"]
for index, color in enumerate(colors):
print(index, color)Вывод:
0 red
1 green
2 blueЧтобы начать отсчёт с другого числа, передайте start:
fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits, start=1):
print(i, fruit)Вывод:
1 apple
2 banana
3 cherryzip() — одновременный перебор двух последовательностей
zip() попарно объединяет элементы двух (или более) итерируемых объектов:
names = ["Alice", "Bob", "Charlie"]
scores = [95, 87, 92]
for name, score in zip(names, scores):
print(name, score)Вывод:
Alice 95
Bob 87
Charlie 92zip() останавливается, когда исчерпывается самый короткий итерируемый объект.
Перебор словарей
Перебор словаря по умолчанию возвращает его ключи:
person = {"name": "Alice", "age": 30, "city": "Paris"}
for key in person:
print(key, ":", person[key])Вывод:
name : Alice
age : 30
city : ParisИспользуйте .items(), чтобы получать пары ключ-значение вместе:
for key, value in person.items():
print(key, ":", value)Вывод:
name : Alice
age : 30
city : ParisСмотрите также главу Перебор словарей для дополнительных шаблонов использования.
Вложенные циклы for
Цикл for можно поместить внутрь другого цикла for. Внутренний цикл выполняется полностью при каждой отдельной итерации внешнего цикла.
Вывод:
red apple
red banana
red cherry
big apple
big banana
big cherry
tasty apple
tasty banana
tasty cherryВажно: оператор break внутри вложенного цикла завершает только внутренний цикл, а не оба. Чтобы выйти из обоих циклов сразу, нужна переменная-флаг или рефакторинг в функцию с использованием return.
Оператор pass
pass — это пустая операция-заглушка. Используйте его, когда синтаксис требует наличия цикла for, но вам пока нечего поместить в его тело:
for i in range(3):
pass # TODO: implement laterБез pass Python выдал бы ошибку IndentationError, так как пустой блок является недопустимым синтаксисом.
Циклы for и списковые включения
Распространённый шаблон — формирование нового списка внутри цикла for:
squares = []
for x in range(1, 6):
squares.append(x ** 2)
print(squares)Вывод: [1, 4, 9, 16, 25]
Python предлагает более лаконичную альтернативу — списковое включение:
squares = [x ** 2 for x in range(1, 6)]
print(squares)Вывод: [1, 4, 9, 16, 25]
Списковые включения идиоматичны для простых преобразований; используйте обычный цикл for, когда тело сложное или имеет побочные эффекты.
Выбор между for и while
| Ситуация | Предпочтительный вариант |
|---|---|
| Известно количество итераций или есть итерируемый объект | for |
| Цикл выполняется до изменения условия | while |
| Нужны индекс и значение | for + enumerate() |
| Перебор двух списков одновременно | for + zip() |