Post content
На заметку начинающим. Оператор 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