for - else
Циклы - неотъемлемая часть любого языка программирования. В свою очередь цикл for также важная часть Python. Однако, существует несколько вещей, связанных с for, о которых не знают начинающие разработчики. Мы остановимся в этой главе на паре нюансов.
Начнём с того, что мы уже знаем. Мы можем использовать циклы for следующим образом:
1
fruits = ['apple', 'banana', 'mango']
2
for fruit in fruits:
3
print(fruit.capitalize())
4
5
# Вывод: Apple
6
# Banana
7
# Mango
Copied!
Это базовая структура цикла for. Теперь перейдем к менее известным особенностям цикла for в Python.

else

Циклы for могут иметь блок else и многие не знакомы с этим фактом. Блок else выполняется, когда цикл завершается в нормальном режиме. Т.е. не был вызван break. Это удобная особенность, которая придется весьма кстати, когда вы поймете где её стоит использовать. Я узнал об этой возможности далеко не сразу.
Типичный пример - поиск элемента в коллекции при помощи цикла for. Если элемент найден - мы останавливаем цикл при помощи break. Существует два сценария, при которых может завершиться исполнение цикла. Первый - элемент найден и вызван break. Второй - элемент так и не был найден и цикл завершился. Мы хотим узнать, какой из этих двух вариантов вызвал остановку цикла. Типичным решением будет создание переменной-флага и её проверка после завершения цикла. Другой способ - использование блока else.
Вот решение на for/else:
1
for item in container:
2
if search_something(item):
3
# Нашли!
4
process(item)
5
break
6
else:
7
# Ничего не найдено...
8
not_found_in_container()
Copied!
Сравним с примером из официальной документации:
1
for n in range(2, 10):
2
for x in range(2, n):
3
if n % x == 0:
4
print(n, 'equals', x, '*', n/x)
5
break
Copied!
Код выше находит целочисленные делители для n. Теперь интересная часть. Мы можем использовать блок else чтобы отслеживать простые числа и выводить их на экран:
1
for n in range(2, 10):
2
for x in range(2, n):
3
if n % x == 0:
4
print( n, 'equals', x, '*', n/x)
5
break
6
else:
7
# Цикл не нашел целочисленного делителя для n
8
print(n, 'is a prime number')
Copied!
Last modified 3yr ago
Copy link
Contents
else