Kontynuujemy, tym razem pętle w Pythonie, poprzednio mówiliśmy o logice w Pythonie, umiemy też już wyświetlać tekst. Umiemy zapisywać informacje, a nawet decydować! Co natomiast jak chcielibyśmy kilka razy zapytać o coś użytkownika? Albo kilka razy powtórzyć konkretną część kodu? Przecież nie będziemy go przeklejać, musi być jakiś sprytniejszy sposób, prawda? Dziś więc będzie o Pętlach w Pythonie.
I właśnie ten sprytniejszy sposób to pętla. I chyba każdy intuicyjnie czuje dlaczego 🙂 Tak jak pętla się… no właśnie, zapętla, tak kod na którym zastosujemy taką konstrukcję, również będzie się powtarzał. Oczywiście chcielibyśmy mieć kontrolę nad tym jak i ile razy się powtarza taki kodzik. No i właśnie tutaj przechodzimy do sedna.
W pętli
Podsumowując pętla to konstrukcja pozwalająca powtarzać kod określoną ilość razy Tak więc program wykonuje blok kodu, wraca na jego początek i wykonuje go znowu, ale ile razy? Tyle na ile pozwoli mu jakiegoś rodzaju iterator. Czyli jakiegoś rodzaju zmienna, która jest zmieniana przy każdym przejściu pętli. Na podstawie wartości której, decydujemy czy powtórzyć następny raz daną część kodu (kto widzi tutaj podobieństwo do ifów? 😉 ).
Jak mówię, pętle pozwalają coś zapętlić, wykonać kilka razy określone kroki, ale na tym się oczywiście nie kończy. Jak się możesz domyślać, w pętli możemy użyć każdej z wcześniej poznanych w tym kursie rzeczy, czyli przykładowo możemy użyć instrukcji warunkowej w pętli i zdecydować czy jeśli iterator osiągną jakąś wartość to wychodzimy z pętli, nie kończąc jej w „naturalny” sposób.
W Pythonie mamy dwie pętle, niby newiele, bo są języki gdzie jest ich dużo więcej, ale tutaj to wystarcza. Jest to pętla for i while, czym się różnią, co robią i czy to samo? Oczywiście jeśli różnią się nazwą to pewnie czymś jeszcze, prawda? A, prawda! Przede wszystkim, pętla while powtarza się, jak sama nazwa wskazuje, dopóki jakiś warunek jest spełniony, a pętla for powtarza się konkretną ilość razy, najczęściej, taką ilość ile jest elementów w danym „tworze”… ale to jeszcze zobaczysz 🙂
Pętle w Pythonie – Pętla while
No i mamy pierwszą z naszych pętli, jest to pętla while, czyli z angielskiego „dopóki”. Co możemy o niej powiedzieć? No, że jest to prosta konstrukcja, ale tak jak w „Zen of Python” – cenimy sobie prostotę, a w Pythonie za pomocą prostych konstrukcji można zrobić bardzo wiele 🙂 No, ale do rzeczy! Poniżej schematyczne przedstawienie pętli while.
Jeśli chodzi o pętle w Pythonie, pętla while składa się ze słówka kluczowego „while”, jakiegoś warunku, który determinuje czy pętla się powtarza czy nie i czegoś do zrobienia, czyli kodu do wykonania. Innymi słowy za „zrób coś” podstawiamy kod, który się powtarza dopóki warunek jest spełniony, dopóki warunek daje nam prawdę. Można też powiedzieć inaczej, przerywamy pętlę w momencie, gdy warunek jest fałszywy.
Potencjalne ryzyko jeśli chodzi o pętle w Pythonie (i nie tylko)
Z pętlą while, wiąże się jedna, ważna rzecz, jest to ryzyko stworzenia, tak zwanej, nieskończonej pętli. Jest to taka pułapka czyhająca na początkujących. Wyobraź sobie, że masz pętlę, której warunek to True, czyli taką jak poniżej.
Jest to pętla, która się powtarza, jak powiedziałem, kiedy jej warunek zwraca prawdę, czyli kiedy jest True. Z tego wynikałoby, że powyższa pętla jest właśnie nieskończona, ponieważ, True zawsze będzie zwracać True, bo właśnie tym jest – prawdą. I tu jest problem, wartość True nigdy nie zwróci False, więc pętla będzie się powtarzać i powtarzać. Jeśli trafimy w taką pętlę możemy nie być w stanie nic zrobić, bo program zapętli się i będzie cały czas robił określoną cześć kodu.
Oczywiście by pętla była nieskończona nie musimy tam koniecznie napisać „True”, wystarczy, że warunek jaki skonstruujemy w wyniku będzie zwracał True zawsze, przykładowo, gdybyśmy skonstruowali warunek, który sprawdzałby czy wartość ujemna jest ujemna, a w pętli ta wartość byłaby zmniejszana, to nigdy nie osiągniemy wartości False, ponieważ wartość zawsze będzie ujemna. Przykład poniżej.
Powyższy program będzie powtarzał się do momentu jak go nie zatrzymamy siłą, albo nie zrobi za nas tego system operacyjny, a dopóki to się nie stanie, będziemy na ekranie otrzymywać napis 'i jest mniejsze od zera’, bo w pętli tylko cały czas zmniejszamy wartość zmiennej i. Natomiast wystarczy zmienić znak z minusa na plus, by zwiększać wartość zmiennej, i tym samym z nieskończonej pętli, zrobić taką, która powtarza się jeden raz. Na początku i jest równe -1, więc wykonujemy kod, po czym sprawdzamy wartość zmiennej, teraz i jest równe zero, a zero nie jest mniejsze od zera, więc wychodzimy z pętli.
Pętle w Pythonie – Pętla for
Oprócz, wspomnianej już pętli while, mamy jeszcze bardzo popularną pętlę for. Jest ona, przynajmniej dla mnie, swego rodzaju super bohaterem. Pętla for jest w pythonowej praktyce stosowana dużą częściej, bo używamy jej po to, by przetwarzać pewien zestaw wartości, z którymi mamy do czynienia na każdym kroku.
W Pythonie mamy takie bardzo eleganckie struktury danych, które pozwolą nam wiele wartości przechowywać. O tych strukturach jeszcze sobie opowiemy w następnych wpisach 😉 Jeśli chodzi o takie eleganckie struktury, to tam właśnie pętla for rozwinie swoje skrzydła. Na razie skupimy się na podstawowych, prostych przykładach użycia.
Jak stworzyć taką pętlę, czyli innymi słowy, jak wygląda składnia? Na początek mamy słówko kluczowe for, od którego musimy rozpocząć. Później mamy zmienną reprezentującą pojedynczą wartość. Następnie jest słówko in, czyli dosłownie 'w czymś’ i nasz zestaw wartości. Czyli 'w zestawie wartości’. Zatem dla każdej wartości, z jakiegoś zestawu, zrób coś z tą pojedynczą wartością.
Schematycznie pętlę for mamy przedstawioną na powyższej grafice. Czyli dosłownie tak jak mówiłem. Pętla ta robi coś dla każdej wartości z danego zestawu wartości, może wyświetlać tą wartość, modyfikować, dodawać do niej, czy coś zupełnie innego. Możemy mieć zestaw maili i dla każdego maila w pętli chcieć przygotować wiadomość. Dla każdej wartości wykonamy blok kodu wewnątrz pętli, czyli po dwukropku.
Nasz zestaw wartości, może być czymkolwiek; liczbami, tekstem, danymi z zewnętrznego zródła. Chodzi o to, w każdym razie, że chcemy dla każdej z wartości, czymkolwiek by nie była, zrobić to samo. Jest to właśnie koncepcja iterowania po tym zestawie wartości, który w Pythonie pętla for sama sobie będzie iterować. Jest to niezwykle ważna koncepcja w programowaniu. Pętla for jest właśnie niezwykle wszechstronna przez działanie na zestawach danych i przede wszystkim jest niezwykle istotna, niezwykle przydatna.
Składnia
W składni tej pętli mamy takie typowe, charakterystyczne dla tego typu struktur w Pythonie. Czyli pierwszą linię kończymy dwukropkiem, a wszystkie operacje, wykonywane w bloku naszej pętli, muszą być wcięte. Standardowo mamy cztery spacje wcięcia. Jeśli tych 4 spacji wcięcia nie będzie, no to będzie to traktowane przez interpreter, po prostu, jako błąd składniowy.
Zobaczmy na jakiś prosty przykład. Na poniższym obrazku mamy values – zmienną, będącą, tak zwaną, listą. Jest to właśnie jedna ze złożonych struktur danych, która jest po prostu zestawem wartości – przechowuje więcej niż jedną wartość. Nasza poniższa lista przechowuje cyfry od 1 do 5, czyli mamy pięć wartości, przedzielonych przecinkami.
Skupmy się jednak na tym, że mamy tą koncepcję zestawu pewnych wartości. I dla każdej z tych wartości wykonujemy tą samą operację. Przykładowo; za pomocą funkcji print() wyprowadźmy sobie każdą z naszych wartości do konsoli. Każda wartość w osobnej linii. Do realizacji takiego zadania, możemy właśnie użyć pętli for.
Rozpoczynamy oczywiście od napisania słówka for. Następnie musimy stworzyć zmienną, która będzie w danym przejściu pętli reprezentowała pojedynczą wartość z naszego zestawu danych (u nas jest to zmienna v). Następnie in, czyli jak powiedziałem, słówko „w” – czyli w jakim zestawie. No i nasz zestaw wartości, po którym stawiamy dwukropek,
Przechodzimy teraz do ciała pętli, czyli właśnie jej zawartości, gdzie będziemy mieć właśnie nasze instrukcje. Kod w ciele będzie robił coś dla każdej wartości z zestawu danych. Czyli w naszym wypadku każdą wartość będziemy printować, jak poniżej widzimy.
I tak oto, stworzyliśmy jedną z najbardziej podstawowych postaci pętli for, która tutaj będzie sama 'wiedziała’, że zmienna v reprezentuje w każdym przejściu kolejną wartość z zestawu wartości, który zawiera zmienna values.
Prostota
Pętle w Pythonie, a raczej szczególnie for, mają bardzo prostą, przejrzystą, i zwięzłą składnię. Duża prostszą niż w wielu innych, popularnych językach programowania. Python kładzie duży nacisk na tą zwięzłość i właśnie to, że pętli for używamy bardzo często, no to właśnie to, że możemy ją bardzo prosto zrealizować, jest pewnym plusem. Oczywiście efektem działania naszej pętli są kolejne cyfry z naszego zestawu danych, w osobnych wierszach (domyślnie print 'robi enter’).
Zwróćmy, jeszcze raz, uwagę, że w ciele pętli możemy wykonać dowolne operacja, przykładowo mnożenie razy dziesięć każdej z wartości lub potęgowanie.
Czyli teraz, patrząc na powyższą grafikę, uzyskam wartości pomnożone razy dziesięć. To w każdym razie działa na prostej zasadzie. W pierwszym przejściu pętli, zmienna v reprezentuje jedynkę, w drugim dwójkę, w trzecim trójkę, i tak dalej. I każdą kolejną z tych cyfr, tutaj mnożymy razy dziesięć.
Warunek w pętlach Pythonowych
Zwróćmy uwagę, że w pętli for, nie musimy definiować warunku zakończenia pętli, ponieważ pętla for się sama zakończy, w momencie, gdy wyczerpaniu ulegną wartości z naszego zestawu wartości. Działa to więc trochę inaczej niż omawiana wcześniej pętla while, gdzie musieliśmy sami definiować warunek zakończenia.
Tutaj pętla sama się zakończy, jak wartości zostaną niejako wyczerpane, co skutkuje przetworzeniem kopletnej listy wartości. Między innymi dlatego, pętla for jest tak bardzo użyteczna. Oczywiście tutaj też możemy stosować słówka breake i continue, tutaj ich zachowanie nie ulega zmianie. Oto przykład:
Zgadniesz co robi powyższy kod? To na zadanie domowe 🙂 Możesz napisać w komentarzu.
Break i continue
Break oraz Continue, to słowa kluczowe, za pomocą których możemy mieć trochę większą kontrolę nad naszymi pętlami, w Pythonie. Pozwalają one niejako wkroczyć do pętli podczas jej działania, po to by podjąć określone decyzje. Znaczy to, że najczęściej będziemy używać tych słów kluczowych w połączeniu z instrukcją warunkową, bo co można o takiej pętli powiedzieć? Co jest zasadniczą cechą pętli? Zwróć uwagę, jeśli pętla zostanie uruchomiona to działa do końca, dopóki się nie „wyczerpie”. Nie mamy możliwości interwencji tak jakby w trakcie działania pętli. Właśnie dlatego wymyślono takie koncepcje jak break czy continue, po to by można było w trakcie działania pętli sterować jej zachowaniem. Pozwala nam to podejmować pewne decyzje w trakcie działania pętli.
Praktyka
Przykładowo, mamy pętlę, która wypisuje kolejne wartości, jak pokazano poniżej.
My jednak, z jakiegoś bliżej nieokreślonego powodu, chcemy mniej więcej w połowie działania pętli – wyjść z niej, przerywając jej działanie. Jak możemy to zrobić? Musielibyśmy na pewno zastosować instrukcję warunkową if, w celu sprawdzenia jaka jest aktualna wartość iteratora. Możemy przykładowo, w tym wypadku, sprawdzić czy wartość counter jest równa 5, jeśli tak się stanie, to użyjemy słowa break do przerwania pętli.
Innymi słowy mówimy, jeśli counter osiągnie wartość pięć, to przerwij działanie pętli i nic więcej nie rób. Jeśli pod pętlą byłaby jakaś dalsza część kodu, to oczywiście, po przerwaniu pętli, rozpoczęłoby się wykonywanie tej części pod pętlą.
Wyświetlamy iterator do wartości cztery, poniewać wyświetlanie wartości zmiennej counter jest na końcu pętli, po break, więc najpierw jest sprawdzane czy counter jest równy 5, a pewnym momencie jest, więc wychodzimy z pętli jeszcze przed wyświetleniem wartości pięć.
Continue w pętlach w Pythonie
Już wiemy co robi pierwsze z omawianych słów kluczowych, służących do sterowania zachowaniem pętli. Pora na drugie z wymienionych słów – continue. Jest to słowo, pozwalające pominąć akcje poniżej, ale tylko w ramach aktualnej iteracji. Innymi słowy, continue wychodzi nam z aktualnego przejścia pętli i wchodzi do następnego, pomijając tym samym wszystko co jest po tym słowie w pętli.
Popatrzmy sobie, na pętlę, która pomija wartości parzyste, czyli tym samym wyświetla tylko wartości nieparzyste.
Różnicę mamy tutaj tylko w warunku. Instrukcja warunkowa używa teraz operatora modulo. Czyli reszty z dzielenia. Jest to reszta z dzielenia counter przez dwa , czyli warunek spełni się dla każdej wartości zmiennej counter, która po podzieleniu przez dwa, daje reszty zero (mówimy o dzieleniu całkowitym). I dla każdej takiej wartości warunek się spełni, czyli zostanie wykonana instrukcja umieszczona w ciele warunku. W tym wypadku jest to instrukcja continue. Czyli po prostu, dla tych wartości cały kod poniżej, w pętli, zostanie pominięty, a pętla przejdzie do następnej iteracji. Gdzie warunek nie będzie spełniony, więc wartość zmiennej counter zostanie wyświetona.
Haczyk
Mając na uwadze opisane powyżej działanie, cały podany kod, w efekcie wyświetli cyfry nieparzyste aż do liczby 10.
Dlaczego widzimy 11? Przecież mamy warunek, który pozwala się powtarzać tylko do 10. No tak, ale przeanalizujmy, że przy counter o wartości 9 wszystko przebiega pomyślnie. Po tej wartości mamy liczbę 10, i dla liczby 10 warunek trwania pętli jest spełniony, więc wykonujemy kod zawarty w pętli. W pętli mamy warunek, który się spełnia przy liczbie 10 i zaczyna następną iterację, która wyświetla aktualną liczbę czyli już wartość 11, i teraz dopiero, przy „naturalnym” rozpoczęciu następnej iteracji, pętla while zwraca false, bo 11 nie jest <= 10, więc pętla się kończy.
Jak widzimy pętle w Pythonie to żadne rocket science, po prostu prosta, intuicyjna rzecz, którą Python. Jak większość działań, nam ułatwia i przyśpiesza 🙂
1 komentarz do “Myśląc o Pythonie: Pętle”