W Pythonie można pisać else nie tylko po if, ale także po pętlach for i while. Ciało else jest wykonywane tylko wtedy, gdy pętla zakończyła się "normalnie" — nie przez break. Umożliwia to elegancką realizację, na przykład, wyszukiwania elementu.
Przykład:
for x in range(5): if x == 3: print('break!') break else: print('Pętla zakończona bez breaka') # nie zostanie wykonane
for x in range(5): if x == 10: break else: print('Pętla zakończona bez breaka') # zostanie wykonane
Ta funkcjonalność jest często używana do "wyszukiwania bez sukcesu": jeśli break nie nastąpił, to znaczy, że element nie został znaleziony.
Czy blok else pętli zawsze jest wykonywany, jeśli pętla się zakończyła? Co jeśli pętla była pusta?
Odpowiedź: Tak, jeśli nie było break, else zawsze zostanie wykonane, nawet jeśli pętla ani razu nie weszła do ciała:
for x in []: print('nic') else: print('else!') # to zostanie wyświetlone
Historia
Projekt: Parser dokumentów.
Problem: Szukaliśmy klucza na liście, a po pętli ustalaliśmy flagę "not found" poza else. W rezultacie wykrywanie elementu działało niepoprawnie, jeśli break nie wystąpił.
Historia
Projekt: Generowanie unikalnych tokenów.
Problem: Logika generowania tokena zależała od poprawnego wyjścia przez break, a else błędnie uważano za "przypadek wyjątkowy", chociaż faktycznie działał w 99% uruchomień, co łamało logikę autoryzacji użytkowników.
Historia
Projekt: Skrypt testujący dla sieciowego API.
Problem: Z powodu błędnego zrozumienia else po while używano go do obsługi timeoutu, chociaż pętla kończyła się nie przez break, a timeouty nie były wychwytywane, co prowadziło do "cichych" błędów w testach.