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?
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).
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 Pudełko startuje z zerem.x o jeden (teraz x to 1). ZAWRÓĆ.x do 2. ZAWRÓĆ.x do 3. ZAWRÓĆ.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.
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.
Pozostaje więc pytanie... Jak programista legalnie wyłącza grę (lub program), skoro pętla ma wpisane True i z definicji jest nieśmiertelna?
Do bezpiecznej ucieczki z każdej pętli, Python oferuje nam słowo kluczowe break (przerwij).
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ę!".
Oto idealny przykład użycia pętli while do małej gry zgadywanki. Przeanalizuj uważnie ten kod!
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?
while not zgadles (czyli dopóki pudełko zawiera False). Zmienna zgadles startuje właśnie jako False.else. Drukujemy "Pudło". Warunek zgadles nie uległ zmianie (nadal jest False), więc po wejściu na szczyt – pętla kręci dalej.if się spełnia. Drukujemy wygraną. Ale najważniejsze – nadpisujemy pudełko: zgadles = True!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.
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)!
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.
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!).
Funkcja range() może przyjąć nie tylko jeden numer. Oferuje pełną kontrolę za pomocą trzech wsadów: (Start, Stop, Krok).
-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).
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)!
Jedyna poprawna wersja uzupełnienia nawiasu to: range(5, 0, -1).
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).
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.
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).
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ć!
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?
print dorzuca też domyślnie \n tworząc po swojej prawej Entera na nową linię).
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!
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...).
Napisz w domowym środowisku PyCharm mały kombajn broniący plików.
poprawne = "admin123").while, która wpina się zasilaniem na sztywno do gniazdka (tzw. nieskończoność wymuszona z użyciem wpisanego while True:).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.else: po strażniku by krzyknąć na ekran dla gracza drukowanym tekstem np: "Hasło złe, odłóż łapy.".Znasz już mechanizmy pętli, dzięki którym zmuszasz maszynę do wyręczania Cię w powtarzalnej, ciężkiej do napisania z klawiatury pracy.
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!