На заметку начинающим.
Оператор for..in имеет необязательный блок else.
Как это работает?
Этот блок выполняется только если итерация завершилась успешно, пройдя все элементы.
Чтобы блок else не выполнился, итерация должна прерваться с помощью break.
Зачем это нужно?
Предполагается, что такая конструкция нужна для определения значения по умолчанию, в случае если мы ищем нужное значение в цикле. Как только необходимые данные найдены, выходим из цикла с помощью break. Если ничего не нашли, то выполняется блок else, в котором выполняем альтернативные действия.
Чем полезно?
В целом, пишется более лаконично (читай питонично)
Позволяет сократить время вычислений, если получение дефолта достаточно затратная процедура. Например, есть такой код:
value = get_default()
for i in array:
res = get_new_value(i)
if res:
value = res
break
В этом примере мы сначала создаем значение по умолчанию, потом в итерации получаем нужный параметр. Если get_new_value() не вернула новое значение, блок if никогда не сработает и остается значение по умолчанию.
Но что, если функция get_default() занимает слишком много времени или не должна вызываться просто так? Тогда написать можно иначе:
value = None
for i in array:
res = get_new_value(i)
if res:
value = res
break
if value is None:
value = get_default()
А с блоком else можно записать короче
for i in array:
res = get_new_value(i)
if res:
value = res
break
else:
value = get_default()
А тех кто на Python3.8+, еще короче:
for i in array:
if (res:=get_new_value(i)):
value = res
break
else:
value = get_default()
Вероятно, можно такую логику записать еще короче, но это уже другая история
#tricks