Циклы - неотъемлемая часть любого языка программирования. В свою очередь
цикл for
также важная часть Python. Однако, существует несколько вещей,
связанных с for
, о которых не знают начинающие разработчики. Мы остановимся
в этой главе на паре нюансов.
Начнём с того, что мы уже знаем. Мы можем использовать циклы for
следующим образом:
fruits = ['apple', 'banana', 'mango']
for fruit in fruits:
print(fruit.capitalize())
# Вывод: Apple
# Banana
# Mango
Это базовая структура цикла for
. Теперь перейдем к менее известным
особенностям цикла for
в Python.
Циклы for
могут иметь блок else
и многие не знакомы с этим фактом.
Блок else
выполняется, когда цикл завершается в нормальном режиме.
Т.е. не был вызван break
. Это удобная особенность, которая придется весьма
кстати, когда вы поймете где её стоит использовать. Я узнал об этой возможности
далеко не сразу.
Типичный пример - поиск элемента в коллекции при помощи цикла for
. Если
элемент найден - мы останавливаем цикл при помощи break
. Существует два
сценария, при которых может завершиться исполнение цикла. Первый - элемент
найден и вызван break
. Второй - элемент так и не был найден и цикл
завершился. Мы хотим узнать, какой из этих двух вариантов вызвал
остановку цикла. Типичным решением будет создание переменной-флага и её
проверка после завершения цикла. Другой способ - использование блока else
.
Вот решение на for/else
:
for item in container:
if search_something(item):
# Нашли!
process(item)
break
else:
# Ничего не найдено...
not_found_in_container()
Сравним с примером из официальной документации:
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print(n, 'equals', x, '*', n/x)
break
Код выше находит целочисленные делители для n. Теперь интересная часть. Мы
можем использовать блок else
чтобы отслеживать простые числа и выводить их
на экран:
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print( n, 'equals', x, '*', n/x)
break
else:
# Цикл не нашел целочисленного делителя для n
print(n, 'is a prime number')