• en
  • Language: ru
  • Documentation version: latest

21. for/else

Циклы являются неотъемлемой частью любого языка. Точно так же циклы for являются важной частью Python. Однако есть несколько вещей, которые большинство начинающих не знают о них. Мы рассмотрим некоторые из них по порядку.

Давайте начнем с того, что мы знаем. Мы знаем, что можем использовать циклы for вот так:

fruits = ['apple', 'banana', 'mango']
for fruit in fruits:
    print(fruit.capitalize())

# Output: Apple
#         Banana
#         Mango

Это самая базовая структура цикла for. Теперь давайте перейдем к некоторым менее известным особенностям циклов for в Python.

21.1. else Клауза

<<<В циклах for также есть пункт else, с которым большинство из нас незнакомы. Пункт else выполняется после нормального завершения цикла. Это означает, что цикл не встретил оператора break. Они действительно полезны, когда вы понимаете, где их использовать. Я сам узнал о них гораздо позже.

Обычная конструкция заключается в запуске цикла и поиске элемента. Если элемент найден, мы выходим из цикла с помощью оператора break. Существует два сценария, при которых цикл может завершиться. Первый - когда элемент найден и встречается оператор break. Второй сценарий - цикл завершается, не встретив оператора break. Теперь мы можем захотеть узнать, какой из этих вариантов является причиной завершения цикла. Один из методов - установить флаг и затем проверить его после завершения цикла. Другой способ - использовать предложение else.

Это основная структура цикла for/else:

for item in container:
    if search_something(item):
        # Found it!
        process(item)
        break
else:
    # Didn't find anything..
    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

Он находит коэффициенты для чисел от 2 до 10. Теперь самое интересное. Мы можем добавить дополнительный блок 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:
        # loop fell through without finding a factor
        print(n, 'is a prime number')