Инструкция, позволяющая производить проход по элементам объектов, поддерживающих итерирование.
Составная инструкция for in else для прохода (итерирования) по элементам последовательностей (таких как строки, списки, кортежи), либо других типов, поддерживающих итерирование.

for el in [1, 2, 3]:
print(el)
else:
print('всё')

# 1 2 3 всё

Часть, идущая после in, будучи вычисленной единожды, должна предоставить объект, поддерживающий итерирование. Для данного объекта создаётся итератор. Далее переменной, предшествующей in, поочерёдно присваиваются значения [элементов], предоставляемые итератором и для каждого из них выполняется тело инструкции.

Внимание
Если тело цикла несложное, то накладные расходы на поддержание цикла интерпретатором могут оказаться существенными. В подобных случаях рекомендуется использовать генератор, составление списка, либо функцию map().

# Проход по элементам словаря.

my_dict = {'a': 1, 'b': 2}

for item in my_dict.items():
print(item)

# item - кортеж из двух элементов
# ('a', 1)
# ('b', 2)

# Распаковка кортежа item в две переменных key и value:
for key, value in my_dict.items():
print('%s -> %s' % (key, value))

# a -> 1
# b -> 2

else


Когда элементы исчерпаны (например, исчерпана последовательность, либо итератор возбудил исключение StopIteration) выполняется часть инструкции, идущая после else (если эта часть присутствует) и цикл завершается.

break


Инструкция break позволяет прервать цикл. При этом часть после else не будет выполнена.

for el in [1, 2, 3]:
print(el)
if el == 2:
break
else:
print('этот текст не будет выведен')

# 1 2

continue


Инструкция continue позволяет «проскочить» исполнение следующего после неё кода и продолжить проход по следующим элементам.

for el in [1, 2, 3]:
if el == 2:
continue
print(el)
else:
print('всё')

# 1 3 всё

На заметку
Переменной, предшествующей in, на каждом из этапов цикла присваивается новое значение. Это означает, что любые назначения данной переменной, будь то произведённые до начала цикла или внутри него, будут потеряны в ходе последующего витка.

По завершению цикла переменная, предшествующая in, остаётся доступной с последним.

for el in [1, 2, 3]:
pass

print(el) # 3

Однако, если последовательность пуста, то переменная не будет инициализирована вовсе, а значит попытка обратиться к ней возбудит исключение NameError.

for el in []:
pass

print(el) # NameError

Внимание
Изменение последовательности в ходе итерирования может приводить к ошибкам и пропускам элементов.

my_list = [1, 3, 4]

for el in my_list:
if el == 1:
del my_list[0]
print(el) # 1 4

for el in my_list:
if el == 1:
my_list.insert(0, 2)
print(el) # 1 1 1 1 1 ... бесконечная рекурсия

При итерировании используется внутренний счётчик, значение которого увеличивается с каждым витком; когда значение становится равным длине последовательности цикл останавливается. Поэтому, если удалить из последовательности текущий (или предыдущий) элемент, то последущий будет пропущен (ведь он будет иметь индекс, который уже был «просмотрен»). Проблемы могут возникнуть и при добавлении элементов. Иногда от подобных от них можно избавиться с помочью итерирования по копии последовательности, с изменением оригинала.


Синонимы поиска: for in else, циклы, проход, break, continue, for_loop, ащк, цикл for, foreach
В разделе «Compound Statements (составные инструкции, операторы)»: if elif else try except finally while else
На заметку
Зарегистрированные пользователи могут добавлять Видео.