Kontrola przepływu
W programach, które widzieliśmy dotychczas, zawsze występowały ciągi wyrażeń, które Python wiernie odtwarzał w podanej kolejności. Co zrobić, gdy chcemy zmienić tę kolejność? Na przykład chcemy, żeby program podejmował decyzje i robił różne rzeczy, zależnie od sytuacji, jak na przykład wypisywał „Dzień dobry” albo „Dobry wieczór” zależnie od pory dnia.
Jak zapewne zgadłeś, uzyskuje się to poprzez używanie wyrażeń kontroli przepływu. W Pythonie są trzy takie wyrażenia: if
, for
oraz while
.
Konstrukcja if
Konstrukcja if
jest używana do sprawdzania warunków. Jeżeli warunek jest prawdziwy, uruchamiamy blok operacji (zwany blokiem if), w przeciwnym wypadku wywołujemy inny blok (zwany blokiem else). Sekcja else
jest opcjonalna.
Przykład:
number = 23
guess = int(input('Enter an integer : '))
if guess == number:
# Nowy blok zaczyna się tutaj
print('Congratulations, you guessed it.')
print('(but you do not win any prizes!)')
# Nowy blok kończy się tutaj
elif guess < number:
# Następny blok
print('No, it is a little higher than that')
# Możesz tu robić co zechcesz
else:
print('No, it is a little lower than that')
# musisz mieć guessed > number aby być tutaj
print('Done')
# Ostatnia instrukcja jest zawsze wykonywana
# po ukończeniu bloku if
Rezultat:
$ python if.py
Enter an integer : 50
No, it is a little lower than that
Done
$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done
$ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done
Jak to działa:
W tym programie użytkownik zgaduje liczbę, a jego strzał jest porównywany z wartością, którą podaliśmy. Ustawiamy zmienną liczba
na dowolną liczbę całkowitą, powiedzmy 23. Następnie prosimy użytkownika o podanie jego strzału używając funkcji raw_input
. Funkcje są częściami programu wielokrotnego użytku. Dowiemy się o nich więcej w następnym rozdziale.
Wpisujemy ciąg znaków do wbudowanej funkcji input
, która wypisuje go na ekran i oczekuje na to, co wpisze użytkownik. Po wpisaniu czegoś i naciśnięciu klawisza kbd:[enter], funkcja input()
zwraca to, co wpisaliśmy jako ciąg znaków. Przetwarzamy go na liczbę całkowita za pomocą int
, a następnie zapisujemy w zmiennej guess
. Właściwie int
jest klasą, ale w tej chwili jedynie musisz wiedzieć, że dzięki niej mozesz zmienić ciąg znaków na liczbę całkowitą (zakładając, że ten ciąg jest liczbą całkowitą zapisaną jako tekst).
W kolejnym kroku porównujemy strzał użytkownika z wybrana przez nas liczbą. Jeżeli są równe, wypisujemy komunikat o sukcesie. Zauważ, że używamy wcięć, aby pokazać Pythonowi, co należy do którego bloku. Oto dlaczego wcięcia w Pythonie są tak ważne. Mam nadzieję, że podpisujesz się pod regułą „spójnych wcięć”?
Zauważ też dwukropek pod koniec linijki z funkcją if
. Pokazujemy tutaj Pythonowi, że do tej funkcji odnosi się blok znajdujący się pod nią.
Później sprawdzamy, czy strzał jest mniejszy od naszej liczby. Jeżeli tak, to sugerujemy użytkownikowi, że powinien podać większą liczbę. Użyliśmy tutaj sekcji elif
, która łączy dwa powiązane wyrażenia if else-if else
w jedno połączone if elif else
. To sprawia, że program jest łatwiejszy i redukuje ilość koniecznych wcięć.
Wyrażenia elif
i else
również muszą mieć na końcu swojej linijki dwukropek, a następnie własny blok poleceń (oczywiście z właściwymi wcięciami).
Możesz wstawić kolejne if
w bloku if ile razy chcesz. To się nazywa zagnieżdżone if.
Pamiętaj, że sekcje elif
oraz else
nie są konieczne. Minimalnym prawidłowym wyrażeniem jest na przykład:
if True:
print('Yes, it is true')
Gdy Python skończył pracę z blokiem if
wraz z towarzyszącymi elif
oraz else
, przeszedł do kolejnego polecenia zawartego w tym samym bloku, co if
. W naszym przykładzie, kolejnym poleceniem jest print('Done')
. Po nim Python widzi koniec programu, więc kończy swoje działanie.
Mimo, ze to był bardzo prosty program, pokazałem mnóstwo rzeczy, które powinieneś zauważyć nawet w tym prostym programie. Wszystkie są bezpośrednie (oraz zaskakująco łatwe dla tych, którzy maja już zaplecze typu C/C++) i wymagają, abyś zawczasu zaczął na nie uważać, ale potem będziesz się czuł z nimi wygodnie i będą one dla ciebie naturalne.
Uwaga dla programujących w C/C++
W Pythonie nie istnieje wyrażenie
switch
. Możesz używać konstrukcjiif...elif...else
z tym samym skutkiem (a w niektórych przypadkach możesz użyć słownika, aby zrobić to szybciej).
Konstrukcja while
Konstrukcja while
pozwala na kilkukrotne wywołanie bloku poleceń, tak długo, jak długo warunek będzie prawdziwy. Konstrukcja while
jest przykładem tego, co nazywamy konstrukcją zapętloną. Konstrukcja while
może posiadać dodatkowy blok else
.
Przykład:
number = 23
running = True
while running:
guess = int(input('Enter an integer : '))
if guess == number:
print('Congratulations, you guessed it.')
# To sprawia, że pętla while przestaje działać.
running = False
elif guess < number:
print('No, it is a little higher than that.')
else:
print('No, it is a little lower than that.')
else:
print('The while loop is over.')
# Możesz tu dołożyć, co zechcesz.
print('Done')
Rezultat:
$ python while.py
Enter an integer : 50
No, it is a little lower than that.
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done
Jak to działa:
W tym programie nadal gramy w zgadywankę, ale zaleta jest taka, że użytkownik może dalej zgadywać, aż odgadnie odpowiedź — nie ma konieczności ponownego uruchamiania programu po każdym strzale, do czego byliśmy poprzednio zmuszeni. To trafnie przedstawia użycie konstrukcji while
.
Przesunęliśmy wyrażenia input
oraz if
do wnętrza while
i ustawiliśmy zmienną dzialaj
na wartość True
przed pętlą while
. Najpierw sprawdzamy, czy zmienna dzialaj
ma wartość True
, a następnie przystępujemy do wykonywania bloku while. Po zakończeniu pracy tego bloku, warunek jest sprawdzany ponownie (w tym wypadku wartość zmiennej dzialaj
). Jeżeli jest prawdziwy, pętla uruchamia się ponownie, w przeciwnym wypadku wywołujemy opcjonalny blok else
i idziemy dalej.
Blok else
jest wywoływany gdy warunek pętli while
przyjmuje wartość False
. To może się wydarzyć nawet za pierwszym razem, gdy warunek jest sprawdzany. Jeżeli istnieje sekcja else
dla pętli while
, jest ona zawsze uruchamiana, z wyjątkiem sytuacji, gdy wyjdziesz z pętli poleceniem break
.
True
oraz False
zwane są typami boolowskimi (typy logiczne — przyp. tłum.) i możesz je uważać za równoważne wartościom odpowiednio 1 i 0.
Uwaga dla programujących w C/C++
Pamiętaj, że zawsze możesz użyć sekcji
else
przy pętliwhile
.
Pętla for
Wyrażenie for...in
jest kolejną pętlą, która iteruje według sekwencji obiektów, czyli przechodzi wzdłuż nich sekwencyjnie. Dowiemy się więcej o sekwencjach w dalszych rozdziałach. Na chwilę obecną musisz wiedzieć jedynie, ze sekwencja to uporządkowany zbiór elementów.
Przykład:
for i in range(1, 5):
print(i)
else:
print('The for loop is over')
Rezultat:
$ python for.py
1
2
3
4
The for loop is over
Jak to działa: W tym programie wypisujemy sekwencję liczb. Generujemy ją używając wbudowanej funkcji range
.
Wpisujemy tu dwie liczby, a funkcja range
zwraca nam sekwencję liczb zaczynając od pierwszej, a kończąc na poprzedniku drugiej. W tym przykładzie range(1, 5)
tworzy sekwencję [1, 2, 3, 4]
. Domyślnie, range
liczy co 1. Jeżeli podamy trzecią liczbę, liczenie będzie się odbywać według niej. Na przykład range(1, 5, 2)
zwróci [1, 3]
. Pamiętaj, że range
liczy do poprzednika drugiej liczby, czyli w wyniku ta druga liczba nie wystąpi.
Zauważ, że pętla range()
generuje tylko jedną liczbę w danym momencie, jeśli chcesz całą listę musisz wywołać list()
nad range()
, na przykład, list(range(5))
co zwróci [0, 1, 2, 3, 4]
.
Następnie pętla for
iteruje w tym zakresie — for i in range(1, 5)
jest równoznaczne z for i in [1, 2, 3, 4]
, co działa jak przypisywanie każdej liczby (lub obiektu) zmiennej i
, a następnie uruchamianie bloku wyrażeń dla każdej wartości i
. W tym przypadku po prostu wypisujemy tę wartość na ekran.
Pamiętaj, że część else
jest opcjonalna. Jeżeli istnieje, jest ona zawsze uruchamiana, z wyjątkiem sytuacji, gdy wyjdziesz z pętli poleceniem break.
Pamiętaj też, że pętla for...in
działa na każdej sekwencji. Tutaj mieliśmy sekwencję liczb wygenerowaną przez wbudowaną funkcję range
, ale tak naprawdę możemy użyć dowolnego rodzaju sekwencji z dowolnym rodzajem obiektów! Przyjrzymy się temu w następnych rozdziałach.
Uwaga dla programujących w C/C++/Java/C#
Pythonowa pętla
for
radykalnie różni się od pętlifor
w C/C++. Programujący w C# zauważą, że Pythonowa pętlafor
jest podobna do pętliforeach
w C#. Programujący w Java zauważą, ze jest podobna do pętlifor(int i : IntArray)
w Java 1.5.W C/C++ pisze się
for(int i = 0; i < 5; i++)
, zaś w Pythonie jedyniefor i in range(0,5)
. Jak widać, w Pythonie pętlafor
jest prostsza, bardziej ekspresywna i mniej podatna na błędy.
Wyrażenie break
Wyrażenia break
używamy, aby wyrwać się z pętli, czyli zakończyć jej działanie, nawet jeżeli warunek pętli nie przyjął wartości False
, lub iteracja się nie zakończyła.
Pamiętaj, że gdy wyjdziesz z pętli for
albo while
używając break
, blok else
nie zostanie wywołany.
Przykład:
while True:
s = input('Enter something : ')
if s == 'quit':
break
print('Length of the string is', len(s))
print('Done')
Rezultat:
$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something : use Python!
Length of the string is 11
Enter something : quit
Done
Jak to działa:
W tym programie wielokrotnie prosimy użytkownika o napisanie czegokolwiek i wypisujemy długość tego ciągu znaków na ekranie. Dodaliśmy specjalny warunek stopu poprzez sprawdzanie, czy użytkownik wpisał quit
. Jeżeli tak, zatrzymujemy pętlę poleceniem break
i wykonujemy końcową część programu.
Długość ciągu znaków sprawdzamy wbudowaną funkcją len
.
Pamiętaj, że wyrażenie break
może zostać w ten sam sposób użyte w pętli for
.
Swaroop's Poetic Python
Tekst, który użyłem w tym przykładzie, to mały wierszyk, który napisałem. Nazywa się Swaroop's Poetic Python (po polsku Poetycki Python Swaroopa — przyp. tłum.).
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
Wyrażenie continue
Wyrażenia continue
używamy, aby nakazać Pythonowi ominąć pozostałe wyrażenia w bloku pętli i kontynuować od następnej iteracji tej pętli.
Przykład:
while True:
s = input('Enter something : ')
if s == 'quit':
break
if len(s) < 3:
print('Too small')
continue
print('Input is of sufficient length')
# Możesz tu dołożyć co zechcesz
Rezultat:
$ python continue.py
Enter something : a
Too small
Enter something : 12
Too small
Enter something : abc
Input is of sufficient length
Enter something : quit
Jak to działa:
W tym programie prosimy użytkownika o wpis, ale zajmujemy się nim jedynie, gdy ma przynajmniej 3 znaki długości. W tym celu używamy wbudowanej funkcji len
, aby poznać długość wpisu i jeżeli jest on krótszy niż 3 znaki, pomijamy resztę poleceń w bloku pętli wyrażeniem continue
. W przeciwnym wypadku, wszystkie pozostałe procesy w bloku pętli zostają uruchomione i możemy zrobić wszystko, co chcemy.
Pamiętaj, że wyrażenie continue
może zostać w ten sam sposób użyte w pętli for
.
Podsumowanie
Zobaczyliśmy, jak używać trzech wyrażeń kontroli przepływu — if
, while
oraz for
, razem z powiazanymi z nimi poleceniami break
i continue
. Są one jednymi z najczęściej używanych części Pythona i w związku z tym obeznanie się z nimi jest niezbędne.
W następnym rozdziale dowiemy się, jak tworzyć i operować funkcjami.