Цикл For-Else похож на оператор if-else? Что стоит за этой необычной конструкцией?
Эта статья предназначена для новичков, пытающихся понять, что такое Python-кодирование. Будучи новичком в Python, меня сначала смутил цикл For-Else. Название предполагает сходство с условием if-else, что наводит меня на мысль, что оно ведет себя аналогично (т. е. если блок «for» разрывается, блок «else» выполняется). На самом деле все наоборот: если блок for прерывается, то else также не выполняется, и наоборот. Это лингвистически (и логически) необычно для блока else. Так почему же цикл For-Else разработан таким образом?
Короткий ответ: он создан по образцу инструкции try-except-else-finally. Длинный ответ ниже…
Давайте сначала разберемся с работой цикла for-else на примере:
CODE>> for i in range(10): print(i) break else: print('Hello')
Приведенный выше код ничего не вернет на консоль.
CODE>> for i in range(10): print(i) else: print('Hello') OUTPUT>> 1 2 3 4 5 6 7 8 9 'Hello'
Приведенный выше код напечатает 1, 2, 3, 4, 5, 6, 7, 8, 9, а затем «Hello» в последующих строках.
Чтобы понять, почему у нас есть блок else, который не ведет себя как типичный блок else, вероятно, он был смоделирован на основе оператора try-except-else-finally, который используется для обработки исключений. Чтобы понять это, давайте посмотрим на различные блоки в операторах обработки исключений Pythonic:
try: # block1 except: # block2 → executed if block1 fails else: # block3 → executed if block1 works! finally: # block4 → executed every time, no matter 'except' and 'else' are executed or not
Цикл for-else в основном предназначен для обработки исключений и включает блок else в том же контексте, что и блок else в операторах try-except-else-finally, где блоки try и exclude представлены блоком for. Следовательно, else выполняется, если нет исключений (т. е. не встречаются разрывы), а else не выполняется (вместе с циклом for), если цикл прерывается.
Это объяснение основано на моем понимании и предположениях и призвано помочь объяснить это сомнение, если оно у вас возникло. Надеюсь, поможет :)