for in else
Инструкция, позволяющая производить проход по элементам объектов, поддерживающих итерирование.
Составная инструкция
Часть, идущая после
Когда элементы исчерпаны (например, исчерпана последовательность, либо итератор возбудил исключение StopIteration) выполняется часть инструкции, идущая после
Инструкция
Инструкция
По завершению цикла переменная, предшествующая
Однако, если последовательность пуста, то переменная не будет инициализирована вовсе, а значит попытка обратиться к ней возбудит исключение NameError.
При итерировании используется внутренний счётчик, значение которого увеличивается с каждым витком; когда значение становится равным длине последовательности цикл останавливается. Поэтому, если удалить из последовательности текущий (или предыдущий) элемент, то последущий будет пропущен (ведь он будет иметь индекс, который уже был «просмотрен»). Проблемы могут возникнуть и при добавлении элементов. Иногда от подобных от них можно избавиться с помочью итерирования по копии последовательности, с изменением оригинала.
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 ... бесконечная рекурсия
При итерировании используется внутренний счётчик, значение которого увеличивается с каждым витком; когда значение становится равным длине последовательности цикл останавливается. Поэтому, если удалить из последовательности текущий (или предыдущий) элемент, то последущий будет пропущен (ведь он будет иметь индекс, который уже был «просмотрен»). Проблемы могут возникнуть и при добавлении элементов. Иногда от подобных от них можно избавиться с помочью итерирования по копии последовательности, с изменением оригинала.
На заметку
Возможно вас заинтересует реализация итерирования в глобальном цикле CPython 3.9, а также реализации функций прохода по элементам списка.
Синонимы поиска: for in else, циклы, проход, break, continue, for_loop, ащк, цикл for, foreach
В разделе «Compound Statements (составные инструкции, операторы)»:
if elif else
try except finally
while else
На заметку
Зарегистрированные пользователи могут добавлять Видео.