Pętle to jedne z najpopularniejszych konstrukcji w każdym języku programowania. W Pythonie przyjrzymy się dwóm konstrukcjom: for oraz while. Każda ma swoje preferowane zastosowania, ale pierwsza z nich jest dużo popularniejsza.

Pętla for

Zacznijmy od przykładu:

values = ['jeden', 'dwa', 'trzy']

for value in values:
    print(value)

Po uruchomieniu tego kodu (np. w sesji interaktywnej) otrzymamy po prostu:

jeden
dwa
trzy

Konstrukcja tej pętli w Pythonie jest nieco specyficzna w porównaniu do wielu innych języków programowania. Można za jej pomocą iterować po kolejnych elementach kolekcji (list, krotek, stringów, słowników, itd.). Jest bardzo podobna do zakresowej pętli for w C++11.

W powyższym przykładzie liczba wywołań funkcji print jest równa liczbie elementów listy values. Przy każdym obiegu pętli, do zmiennej value jest przypisywana kolejny element listy values oraz wykonywany jest kod ze środka pętli – w tym przypadku wypisujemy wartość zmiennej value na ekran.

W ten sposób możemy wykonać dowolne operacje po kolei na wszystkich elementach kolekcji.
Ponieważ nie jest to pętla numeryczna – nie mamy tutaj indeksów oraz warunków początku i końca pętli – przetwarzanie kolekcji w ten sposób jest bezpieczne i wygodne.

Pętla while

Ta konstrukcja pozwala wykonywać kod, dopóki warunek pętli jest prawdziwy (True). Jest wygodniejsza, kiedy potrzebujemy np. pętli nieskończonej (ewentualnie przerywanej poprzez break w pewnych sytuacjach):

while True:
    user_input = input("Wpisz cokolwiek: ")
    if not user_input:
        break
    print(user_input)
print("Jesteśmy poza pętlą while.")

Ten przykład jest już o wiele ciekawszy. True jako warunek pętli oznacza jej wykonywanie w nieskończoność. Korzystając z funkcji input, pobieramy od użytkownika jakiekolwiek dane wejściowe i wypisujemy je na ekran. Jeśli użytkownik nie wpisze nic i naściśnie jedynie ENTER, przerywamy pętlę używając słowa kluczowego break.

Pętla while pozwala na wygodną obsługę sytuacji, w których nie wiemy tak naprawdę, ile razy wykonamy kod zawarty w ciele pętli. Dobrze sprawdza się w sytuacjach, kiedy warunkiem kontynuacji/przerwania wykonywania pętli jest wyrażenie zwracające logiczną prawdę (True) lub fałsz (False).

break oraz continue

Jeśli chcemy w pewnym momencie zakończyć działanie pętli (zarówno for jak i while) lub przerwać dany obieg pętli i pójść do następnego, mamy do dyspozycji słowa kluczowe break oraz continue.

Zobaczmy, jak to wygląda w praktyce:

values = [3, 5, 2, 4, 1]

for value in values:
    if value == 4:
        print("Znalazłem czwórkę, kończę przeszukiwanie !")
        break

    print(value)

Przykład jest bardzo prosty (i nieco naiwny – istnieją o wiele lepsze sposoby wyszukiwania wartości w kolekcjach), ale dokładnie pokazuje działanie instrukcji break. Po uruchomieniu kodu widzimy:

3
5
2
Znalazłem czwórkę, kończę przeszukiwanie !

Jeśli chodzi o continue – Jeśli w pewnym momencie nie ma sensu wykonywać dalej kodu zawartego w pętli (bo np. uzyskaliśmy, co chcieliśmy w danym obiegu), możemy użyć słowa continue do przerwania danego obiegu pętli i pójścia do następnego.

Czyli:

values = ['jeden', 'dwa', 'trzy']

for value in values:
    if 'e' in value:
        continue
    print(value)

i rezultat:

dwa
trzy

Powyżej wypisane zostały tylko te elementy listy, które nie zawierają litery e.

Klauzula else

To nie jest pomyłka 🙂 else znajduje zastosowanie również w pętlach for oraz while. Jest to rzadko stosowana konstrukcja, ale warto o tym wiedzieć.

Sprawa wygląda następująco:

values = ['jeden', 'dwa', 'trzy', 'cztery', 'pięć']

for value in values:
    print(value)
    if value == "sześć":
        break;
else:
    print("Zakończyłem wypisywanie elementów na ekran.")

Jest to sytuacja podwójnie zaskakująca. Po pierwsze: else w tandemie z pętlą wygląda dziwnie i trzeba do tego przywyknąć. Po drugie: blok else nie do końca działa tutaj jak alternatywa. Wbrew intuicji kod zawarty po klauzuli else jest wykonywany zawsze po normalnym zakończeniu działania pętli. Rezultatem powyższego przykładu jest:

jeden
dwa
trzy
cztery
pięć
Zakończyłem wypisywanie elementów na ekran.

Dlaczego mówiłem o normalnym zakończeniu pętli ? Otóż istnieje tutaj wyjątek. W wypadku przerwania działania pętli z użyciem słowa break, blok else nie zostanie wykonany. Wystarczy dopisać wartość sześć do listy values w przykładzie i sprawdzić co się stanie.

To tyle na dzisiaj. W razie wątpliwości zapraszam do zadawania pytań w komentarzach 🙂