> For the complete documentation index, see [llms.txt](https://pavel-karateev.gitbook.io/intermediate-python/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://pavel-karateev.gitbook.io/intermediate-python/sintaksis/for_-_else.md).

# for - else

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

Начнём с того, что мы уже знаем. Мы можем использовать циклы `for` следующим образом:

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

# Вывод: Apple
#        Banana
#        Mango
```

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

## `else`

Циклы `for` могут иметь блок `else` и многие не знакомы с этим фактом. Блок `else` выполняется, когда цикл завершается в нормальном режиме. Т.е. не был вызван `break`. Это удобная особенность, которая придется весьма кстати, когда вы поймете где её стоит использовать. Я узнал об этой возможности далеко не сразу.

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

Вот решение на `for/else`:

```python
for item in container:
    if search_something(item):
        # Нашли!
        process(item)
        break
else:
    # Ничего не найдено...
    not_found_in_container()
```

Сравним с примером из официальной документации:

```python
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` чтобы отслеживать простые числа и выводить их на экран:

```python
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')
```
