Блок else в циклах for и while

В Python циклы for и while могут содержать блок else, который выполнится, только если цикл завершится без применения break.

Рассмотрим это на примере функции, ищущей иголку (needle) в стоге сена (haystack).

def contains(haystack, needle):
    """
    Выбрасывает ValueError, если `needle` нет в `haystack`.
    """
    for item in haystack:
        if item == needle:
            break
    else:
        # Блок `else` здесь запускается, только если 
        # цикл доходит до конца без участия оператора `break`.
        raise ValueError('Needle not found')


>>> contains([23, 'needle', 0xbadc0ffee], 'needle')
None

>>> contains([23, 42, 0xbadc0ffee], 'needle')
ValueError: "Needle not found"