🔁 Po co nam Pętle?

Znamy już instrukcje warunkowe (if), które decydują o tym, CZY wykonać dany kod. Ale co w przypadku, gdy chcielibyśmy, aby nasz kod wykonał się wiele razy?

Wydrukuj słowo "Python" 100 razy na ekranie!
👩‍🏫
Chyba żartujesz... nie będę pisał 100 linijek kodu! 😫
🧑‍💻

I słusznie! Od powtarzania monotonnych zadań są maszyny, nie my. Do automatycznego powtarzania fragmentów kodu służą specjalne konstrukcje zwane pętlami (ang. loops).

🎡 Pętla 'while' (Dopóki)

Najprostszą pętlą do zrozumienia jest pętla while. Jej składnia przypomina do złudzenia instrukcję if, ale kryje potężną różnicę w działaniu.

x = 0

while x < 3:
    print("Jeszcze kręcimy!")
    x += 1          # WAŻNE: Aktualizacja zmiennej!

print("Koniec zabawy.")
Słowo while oznacza "dopóki". Pętla ta sprawdza warunek i jeśli to Prawda (True), wykonuje cały wcięty kod pod spodem. Gdy dojdzie do ostatniej linijki bloku, cofa się na samą górę i pyta ponownie! Pętla pęka dopiero wtedy, gdy warunek na samej górze stanie się Fałszem.

🔍 Analiza pętli 'while' Krok po Kroku

Oto co DOKŁADNIE dzieje się w pamięci RAM podczas działania kodu z poprzedniego slajdu:
  1. x = 0 Pudełko startuje z zerem.
  2. Sprawdzenie 1: Czy 0 < 3? Tak (True). Drukuj tekst. Zwiększ x o jeden (teraz x to 1). ZAWRÓĆ.
  3. Sprawdzenie 2: Czy 1 < 3? Tak (True). Drukuj tekst. Zwiększ x do 2. ZAWRÓĆ.
  4. Sprawdzenie 3: Czy 2 < 3? Tak (True). Drukuj tekst. Zwiększ x do 3. ZAWRÓĆ.
  5. Sprawdzenie 4: Czy 3 < 3? NIE (False). Uff! Pętla się łamie. Program skacze za jej granicę do napisu "Koniec zabawy".

🔥 Nieskończona Pętla (Infinity Loop)

Największym niebezpieczeństwem przy używaniu pętli while jest zapomnienie o zaktualizowaniu zmiennej, od której pętla zależy. Tworzy się wtedy Nieskończona Pętla, pożerająca całą moc procesora.

haslo = "tajne"

# Zapomnieliśmy dać input() w środku! Zmienna 'haslo' na zawsze zostaje jako "tajne".
while haslo != "admin123":
    print("Błędne hasło! Podaj ponownie.")
    # Komputer zawiesza się, mieląc ten print miliony razy na sekundę...
Kiedy przez przypadek odpalisz taki kod i Twój komputer zacznie "wyć", nie wpadaj w panikę! W terminalu wystarczy nacisnąć Ctrl + C (tzw. Keyboard Interrupt), co awaryjnie zabija dany proces w Pythonie.

🎮 Celowe Pętle Nieskończone

Zaskakujące jest to, że w świecie IT nieskończone pętle są podstawą działania! Niemal każda gra komputerowa, czy program na smartfonie, opiera się na Main Game Loop.

# Wpisanie True na stałe: Ta pętla z założenia ma kręcić się w kółko!
while True:
    print("Wykrywam naciśnięcie klawiszy przez gracza...")
    print("Renderuję klatkę (grafikę) na ekranie...")
    # Robi to np. 60 razy na sekundę (60 FPS)

Pozostaje więc pytanie... Jak programista legalnie wyłącza grę (lub program), skoro pętla ma wpisane True i z definicji jest nieśmiertelna?

🚪 Wyjście Awaryjne: 'break'

Do bezpiecznej ucieczki z każdej pętli, Python oferuje nam słowo kluczowe break (przerwij).

while True:
    komenda = input("Wpisz 'wyjscie' aby opuścić program: ")

    if komenda == "wyjscie":
        print("Zamykam serwery! Pa.")
        break                     # TO NATYCHMIAST NISZCZY PĘTLE!

    print("Jesteś nadal w programie.")
break działa jak teleportacja z pętli. Gdy interpreter najeżdża na to słowo, ignoruje jakikolwiek warunek zapisany u góry i natychmiast przeskakuje pod samą dolną krawędź pętli, kontynuując resztę aplikacji.

⏭️ Pomijanie okrążenia: 'continue'

Drugim magicznym słowem obok `break`, jest continue. Oznacza ono: "Zignoruj resztę kodu pod spodem na to konkretne okrążenie i zawróć na samą górę, by odpalić kolejną rundę!".

licznik = 0
while licznik < 5:
    licznik += 1

    if licznik == 3:
        continue                # Gdy licznik to 3, zawracaj od razu w górę!

    print(licznik)                # Wypisze: 1, 2, 4, 5 (Cichaczem pominął print dla trójki!)
Wyobraź sobie, że przeglądasz w pętli wielką księgę inwentaryzacyjną. Zauważasz nagłówek "Meble". Skoro jesteś tu by liczyć żywność, wpisujesz w głowie polecenie `continue` – natychmiast ignorujesz resztę strony z meblami i odwracasz na kolejną kartkę!

🎯 Ćwiczenie: Zgadnij Liczbę

+200 XP

Pętla w Minigrze

Oto idealny przykład użycia pętli while do małej gry zgadywanki. Przeanalizuj uważnie ten kod!

tajna_liczba = 7
zgadles = False

while not zgadles:
    strzal = int(input("Zgadnij moją cyfrę: "))
    if strzal == tajna_liczba:
        print("Zgadłeś!")
        zgadles = True
    else:
        print("Pudło. Próbuj dalej!")

Zastanów się: Co dokładnie decyduje o tym, że kod nie zakręci się w nieskończoność? Jak zadziała warunek na górze, gdy wpiszemy w konsoli liczbę 7?

✅ Odpowiedź do: Zgadnij Liczbę

  1. Warunek na górze brzmi: pętla się kręci while not zgadles (czyli dopóki pudełko zawiera False). Zmienna zgadles startuje właśnie jako False.
  2. Gdy uczeń wpisze w input cyfrę 5, lądujemy w else. Drukujemy "Pudło". Warunek zgadles nie uległ zmianie (nadal jest False), więc po wejściu na szczyt – pętla kręci dalej.
  3. Gdy uczeń wpisze w końcu 7, warunek if się spełnia. Drukujemy wygraną. Ale najważniejsze – nadpisujemy pudełko: zgadles = True!
  4. Pętla dochodzi do dołu i wraca na sam szczyt by zbadać warunek. Widzi teraz True. Magiczne słowo `not` odwraca True w Fałsz. Skoro wyszedł Fałsz – pętla zostaje wyłączona, a gra zakończona!

🚂 Drugi typ Pętli: Pętla 'for'

Pętlę while wykorzystujemy, gdy nie wiemy ile czasu zajmie dojście do celu (nie wiemy, za którym razem użytkownik poda poprawne hasło). A co gdy z góry to wiemy?

Pętli for używamy, gdy chcemy wykonać zadanie określoną ilość razy (np. dokładnie 100 powtórzeń), albo gdy chcemy "przejść się" po każdym elemencie leżącym w jakiejś Liście.

imiona = ["Anna", "Borys", "Celina"]

for osoba in imiona:
    print("Witaj " + osoba)
Składnię for X in Y: czytamy po polsku jako "Dla każdego elementu X ukrytego w zbirze Y zrób poniższy kod". Python bardzo sprytnie zajmuje się indeksami pod maską. Sam weźmie pierwszą osobę, potem drugą osobę, wydrukuje jej imię... a na koniec automatycznie wyłączy pętlę bez ryzyka nieskończonego zacięcia!

🔢 Generowanie liczb: funkcja range()

Nie mamy listy gotowych słów, ale po prostu chcemy zakodować: "Zrób równe 5 przysiadów". Jak użyć pętli for bez posiadania listy przed oczami? Używamy generatora range() (zakres)!

# range(5) robi kolejkę liczb od 0 do 4
for i in range(5):
    print(i)
# Wydrukuje kolejno każdą na nowej linii: 0, 1, 2, 3, 4

Zmienna i to tymczasowe pudełko (często używa się litery `i` od słowa index, ale równie dobrze możesz wpisać for numer in...). W pierwszym okrążeniu wpada do niego 0, w drugim okrążeniu wpada 1... aż dobrnie do limitu wyznaczonego przez range.

Złota zasada Pythona i wielu języków - odliczanie indeksów rozpoczynamy od ZERA! Podając z palca range(5) mówisz "Wykonaj 5 pełnych kroków". Skoro pierwszym krokiem jest ten z numerem 0, to naturalnie komputer na ekranie wyświetli wartości tylko do liczby 4 włącznie (co nadal daje łącznie aż pięć okrążeń pętli!).

🎛️ Zaawansowany moduł range()

Funkcja range() może przyjąć nie tylko jeden numer. Oferuje pełną kontrolę za pomocą trzech wsadów: (Start, Stop, Krok).

# Startujemy na 2, Zatrzymujemy na 6 (Zasada: bez samego 6!):
for i in range(2, 6):
    print(i)                    # Wypisze: 2, 3, 4, 5

# Startujemy na 0, Zatrzymujemy na 10, Ustawiamy Skok co 2 oczka!:
for i in range(0, 10, 2):
    print(i)                    # Wypisze np. tylko parzyste: 0, 2, 4, 6, 8
Skok nie musi być liczbą rosnącą! Jeśli ustawisz Krok (trzecią wartość) na liczbę ujemną np. -1, wykreujesz pętle dającą nam odliczanie w dół! (Musisz tylko pamiętać żeby podać wielki Start po lewej i mały Stop po prawej, jak przy odpalaniu Rakiety na księżyc).

🎯 Ćwiczenie: Zegarmistrz Zniszczenia

+150 XP

Stwórz licznik bomby C4!

Chcemy wyświetlić na ekranie, że mija czas do eksplozji tykającej bomby. Chcemy wypisać na ekranie odliczanie twardo od 5, w dół aż do 1. Gdy pętla łagodnie się skończy, wypisujemy pod nią wybuch.

W jaki sposób skonfigurujesz funkcję range(Start, Stop, Skok), aby pętla for spełniła Twoje oczekiwania? Pamiętaj o tym co "zjada na końcu" funkcja Stop (czyli przed jaką cyfrą awaryjnie hamuje)!

import time                       # Importuje narzędzia do spowalniania czasu z bibliotek Pythona

for sekunda in range(???, ???, ???):
    print(sekunda)
    time.sleep(1)                 # Zamraża działanie procesora na równo 1 sekundę

print("💥 BOOM!")

✅ Rozwiązanie: Odliczanie C4

Jedyna poprawna wersja uzupełnienia nawiasu to: range(5, 0, -1).

  1. Nasz wielki Start to 5 (zaczynamy druk od tej liczby).
  2. Zatrzymujemy się tuż PRZED uderzeniem w punkt Stop. Skoro daliśmy Stop na zero (0), a pętla idzie skokami wstecz, to jej ostatnią bezpieczną przystanią i cyfrą wyplutą na ekran przez print() będzie liczba 1.
  3. Wymusiliśmy skakanie do tyłu używając trzeciego parametru z minusem: -1.
for sekunda in range(5, 0, -1):
    print(sekunda)

🧱 Zagnieżdżone Pętle (Loop Inception)

Skoro w if mogliśmy zagnieździć kolejnego ifa, to samo musi tyczyć się Pętli. Nazywamy to Zagnieżdżaniem. To fundament i podstawa przy kodowaniu gier używających systemu siatki na planszy (współrzędne pionowe Y oraz poziome X).

for y in range(3):                      # Zewnętrzna, Główna pętla wierszy (Góra -> Dół)
    for x in range(3):                  # Wewnętrzna, mała pętla kolumn (Lewo -> Prawo)
        print("[", x, ",", y, "]")
Jak działa taka turbina? Zewnętrzna wielka pętla łapie zmienną Y = 0. Ale zanim przeskoczy do Y = 1, cierpliwie CZEKA, aż mała pętla wewnętrzna (X) wciągnie powietrze i wykona dla niej CAŁĄ swoją mozolną robotę (czyli wymieli 3 szybkie okrążenia: 0, 1, 2). Kiedy mała wewnętrzna pętelka (X) pęknie, powracamy na tory dużej i zrzucamy głaz w dół: na Y = 1. Mała znowu zapala silniki.

🎨 Rysowanie Piramid (Sztuka z pętli)

Spójrzmy na potęgę języka Python używając pętli for. Ciekawostka: w Pythonie by nakreślić 10 uśmieszków :-) w konsoli, nie musimy dodawać ich do siebie w kolejnej pętli 10 razy. Pamiętasz, że `stringi` można było po prostu MNOŻYĆ przez cyfry, żeby je sklonować? ("Ha!" * 3).

for i in range(1, 6):
    print("*" * i)
# Konsola narysuje piękną rosnącą piramidę:
*
**
***
****
*****
W pierwszym okrążeniu zmienna i zdejmuje jedynkę (1). Gwiazdka pomnożona * 1 = jedna gwiazdka wydrukowana na ekran. W drugim okrążeniu i ładuje dwójkę. Gwiazdka * 2 = dwie piękne gwiazdki obok siebie... Taki szybki trick ratuje Pythonowców na pierwszych etapach rekrutacji na Juniora, bo inni (w C++) użerają się właśnie z Zagnieżdżonymi podwójnymi Pętlami by to namalować!

🏃 Spacer Formuły 1 (Pętle For ze Stringami)

Zmienna String "Witaj", to tak naprawdę nic innego jak "cienki sznur, na którym nawleczone obok siebie są twarde koraliki z literami".

A pętla for X in Y z definicji potrafi przeglądać KAŻDY z elementów od góry do dołu. Jak myślisz co powstanie po wrzuceniu wyrazu do pętli For?

tajny_kod = "PYTHON"

for koralik in tajny_kod:
    print("--> " + koralik)
Pętla wyciąga pierwszą literę (P) - wykonuje obrót z wypisaniem. Potem chwyta następny koralik (Y) - wykonuje obrót. Wynik zderzenia ze sobą terminala to litery wydrukowane pojedynczo, pięknie wycentrowane jedna pod drugą w chudej kolumnie (każdy zwykły print dorzuca też domyślnie \n tworząc po swojej prawej Entera na nową linię).

🧮 Odmierzanie punktów (Błąd "wciecia")

Pętli niezwykle często używamy do aktualizowania i potężnego zsumowywania jakiejś innej zmiennej, która trzyma łączny dobytek (np. Kasa w banku). Ale ukrywa się ona na marginesie wyżej - zupełnie poza szponami i nawiasami samej Pętli!

skarbiec_exp = 0               # Startujemy z absolutnie niczym na górze

for i in range(1, 11):              # Rozpal silnik! Pętla startuje okrążenia
    skarbiec_exp += 5           # Wymagane wcięcie = co obrót rzucamy 5 xp do kufra wyżej!

print(skarbiec_exp)               # Ostateczny, epicki wynik: 50!
Skup się na ostatniej linijce: print() na samym dole NIE JEST w ogóle wcięte w prawo. Oznacza to żelazną zasadę w kodowaniu: że ten print wyrzucono poza kocioł pętli! Poczeka on sobie cichutko, a wydrukuje dla gracza po prostu "jeden, wielki, finalny i gotowy po wyłączeniu śmigieł wynik 50". Gdybyś niechcący dał tam wcięcie w prawo z tabulatora... konsola krzyczałaby po każdych oddanych 5 XP dla bohatera co ułamek sekundy! (5, 10, 15...).

🎯 Ostateczne Starcie (Projekt Domowy)

+500 XP

Tworzymy Hasło Sejfowe Ostateczne!

Napisz w domowym środowisku PyCharm mały kombajn broniący plików.

  1. Stwórz poprawny wzór w zmiennej (np. poprawne = "admin123").
  2. Użyj agresywnej pętli while, która wpina się zasilaniem na sztywno do gniazdka (tzw. nieskończoność wymuszona z użyciem wpisanego while True:).
  3. Wnętrze wciętej pętli: poproś gracza o podanie hasła przez przypisany do pudełka na tekst nowiusieńki `input`.
  4. Ustaw obok sprawdzarkę strażnika: if podane == poprawne. Jeśli strażnik krzyknie że to Prawda: Wypisz ładne gratulacje z wejściem do sejfu i wybij szybkę ratunkową używając potężnego polecenia break by teleportować silnik i uciec z wiru nieskończonej pętli.
  5. Jeśli hasło jest okropne, pętla samoistnie i po cichu zakręci w górę zmuszając delikwenta w kółko o podanie `inputu`. Zawsze jednak używaj zapasowego komina komendzie else: po strażniku by krzyknąć na ekran dla gracza drukowanym tekstem np: "Hasło złe, odłóż łapy.".

🚀 Finał Podstawowej Wędrówki

Znasz już mechanizmy pętli, dzięki którym zmuszasz maszynę do wyręczania Cię w powtarzalnej, ciężkiej do napisania z klawiatury pracy.


🎓 +10 000 XP Otrzymano

Posiadasz pełen potężny warsztat złożony ze: Zmiennych przetrzymujących Twoje monety, IF'ów oceniających czy potwór żyje i FOR/WHILE do liczenia ekwipunku bez bólu głowy w kółko... Tworzysz programy!