Warunki w Pythonie
Instrukcja warunkowa if
Często zdarza się, że chcemy coś zrobić tylko w pewnych przypadkach. Oto kilka przykładów:
- moglibyśmy chcieć wyświetlać reklamy tylko dla darmowych kont,
- jeśli wiadomość pochodzi od osoby zablokowanej, to powinniśmy ją ukryć,
- jeśli post jest promowany, to mógłby mieć odpowiednią etykietę "Promowany".
Aby w kodzie zrobić coś pod określonym warunkiem, używamy instrukcji warunkowej if. Zaczynamy ją od słowa kluczowego if
1, po czym umieszczamy warunek (ang. condition). Warunek to wyrażenie2 zwracające wartość logiczną (czyli True
lub False
). Można go utworzyć na przykład przy użyciu znaku porównania ==
, <
czy !=
. Za warunkiem umieszczamy dwukropek :
i od następnej linii określamy instrukcje, które powinny zostać wywołane, gdy warunek jest spełniony (zwraca True
). Te instrukcje nazywane są ciałem warunku. Instrukcje w ciele muszą być poprzedzone wcięciem, czyli czterema spacjami. Dzięki tym wcięciom Python jest w stanie odróżnić je od reszty kodu. Jeśli warunek nie jest spełniony (zwraca False
), to te instrukcje nie zostaną wykonane.
if True:
print("To się wypisze") # To się wypisze
if False:
print("A to nie")
tweet_type = "promotional"
tweet_owner = "marcinmoskala"
your_key = "yourname"
if tweet_type == "promotional":
print("Promowany") # Promowany
if tweet_owner == your_key: # False,
# ponieważ "marcinmoskala" nie jest równe "yourname"
print("Twój tweet")
# Wypisze się:
# To się wypisze
# Promowany
Wcięcia
Wcięcia, czyli dodatkowe spacje przed pewnymi instrukcjami, są bardzo ważne w języku Python. Popatrz na poniższy kod:
if False:
print("A")
print("B")
Co powinno zostać wypisane? Odpowiedź to tylko "B", ponieważ print("A")
znajduje się w instrukcji if, której warunek nie jest spełniony. Skąd jednak wiemy, że print("A")
jest w ciele tego warunku, a print("B")
już nie? Właśnie dzięki wcięciom.
if weekday == 'friday':
print("Impreza!")
W ciele instrukcji if możemy postawić kolejną taką instrukcję. W takim przypadku do jej ciała dodajemy dodatkowe wcięcie.
is_logged = True
is_admin = False
if is_logged:
print("Użytkownik zalogowany")
if is_admin:
print("Admin")
# Wypisze się:
# Użytkownik zalogowany
Zauważ, że wcięcia są pomocne nie tylko dla kompilatora, ale i dla nas. Ułatwiają odróżnienie, co znajduje się w ciele funkcji, a co nie.
Przez długi czas toczyła się dyskusja nad tym, czy tworzyć wcięcia poprzez spacje, czy poprzez znak tabulacji. Aktualnie spacje są standardem, ale w niektórych projektach wciąż spotkać można tabulacje. Nigdy jednak nie należy mieszać tych dwóch konwencji w jednym projekcie.
Zestaw reguł określający jak powinien wyglądać kod, nazywany jest formatowaniem. Określa on: jakie powinny być wcięcia, gdzie stawiamy entery i spacje, jak nazywamy zmienne itp. Formatowanie może się różnić w zależności od projektu. W języku Python najczęściej stosuje się wcięcia na cztery spacje i w związku z tym, w tej książce stosuję taką samą konwencję. Czasem można spotkać się ze wcięciami na dwie spacje.
Puste ciało
Ciało wyrażenia if musi być poprzedzone odpowiednimi wcięciami. Co jednak, jeśli z jakiegoś powodu ciało to jest puste. Python nie widzi żadnych instrukcji i myśli, że to my popełniliśmy błąd. W takich przypadkach konieczne jest umieszczenie w ciele warunku słówka pass
. To słowo kluczowe nie wykonuje żadnej operacji, ale jest konieczne, by nasz kod zadziałał. Jest także przydatną informacją dla osoby czytającej ten kod: informuje, że ciało warunku jest umyślnie pozostawione puste.
if is_logged:
pass
W praktyce nieczęsto widuję pass
w finalnym kodzie. Jest jednak przydatne w czasie pracy, na przykład w sytuacji, kiedy najpierw chcemy skupić się na napisaniu warunku, a dopiero potem na ciele. Słowo kluczowe pass
jest analogicznie używane, gdy chcemy pozostawić puste ciało else, elif, funkcji, pętli for i w wielu innych strukturach, które omówimy w dalszej części tej książki.
Ćwiczenie: if
Napisz kod, który:
- wypisze "Szanownie" jeśli zmienna
is_important
ma wartośćTrue
, - wypisze "Witam".
- wypisze "Panią" jeśli zmienna
gender
ma wartość "female", - wypisze "Pana" jeśli zmienna
gender
ma wartość "male".
Najpierw wypisz każdą z wartości poprzez osobne wywołania print
, a następnie zastanów się, jak to zrobić, by połączyć je wszystkie i wypisać w jednej linii.
Sprawdź, jak zachowa się Twój kod dla różnych wartości is_important
(wartość logiczna True
/False
) i gender
(wartość string "male", "female" lub inna).
Odpowiedzi na końcu książki.
Wywołanie warunkowe z częścią else
Ciało w instrukcji warunkowej if zostanie wywołane tylko wtedy, gdy warunek będzie spełniony. Co zrobić w sytuacji, gdybyśmy chcieli wykonać jakąś akcję również w przypadku, gdy nie będzie on spełniony? Załóżmy na przykład, że jeśli tweet jest promowany, to powinien się wyświetlić tekst "Promowany", a w przeciwnym przypadku "Zwykły". Zatem moglibyśmy użyć dwóch instrukcji warunkowych if: jednej sprawdzającej warunek, a drugiej jego odwrotność. Ponieważ jednak sytuacja taka jest dość częsta, warunek if pozwala na zdefiniowanie części else3, która określa co powinno się stać, gdy warunek nie będzie spełniony.
tweet_type = "standard"
if tweet_type == "promotional":
print("Promowany")
else:
print("Zwykły")
# Efekt ten sam, co gdybyśmy zrobili:
if tweet_type == "promotional":
print("Promowany")
if tweet_type != "promotional":
print("Zwykły")
Zauważ, że zawsze zostanie wywołane albo ciało z if, albo ciało z else. Ten fakt często się wykorzystuje, gdy na przykład używamy if-else do ustawienia wartości zmiennej.
tweet_type = "standard"
if tweet_type == "promotional":
label = "Promowany"
else:
label = "Zwykły"
print(label) # Zwykły
label
zawsze będzie miało pewną wartość: albo "Promowany", albo "Zwykły".
Wywołanie warunkowe z częścią elif
Co natomiast, gdy mamy więcej alternatyw? Na przykład kilka warunków, które kolejno chcemy sprawdzać. Aby obsłużyć każdą z tych wartości, moglibyśmy użyć części elif (skrót od "else if", czyli "w przeciwnym wypadku, jeśli"). Tę część umieszczamy po ciele warunku if, ale przed else. Pozwala ona określić kolejny warunek, który zostanie sprawdzony, jeśli warunek z if spełniony nie będzie. Jeśli warunek z elif będzie spełniony, to jego ciało zostanie wykonane. Takich części elif możemy zdefiniować wiele.
Przykładowo, gdybyśmy chcieli obsłużyć kilka możliwych wartości tweet_type
:
- "promotional" oznaczające tweet promowany,
- "followed" oznaczające tweet osoby obserwowanej,
- "own" oznaczające tweet zalogowanego użytkownika.
if tweet_type == "promotional":
print("Promowany")
elif tweet_type == "followed":
print("Zwykły")
elif tweet_type == "own":
print("Własny")
else:
print("Inny")
# To samo co
if tweet_type == "promotional":
print("Promowany")
else:
if tweet_type == "followed":
print("Zwykły")
else:
if tweet_type == "own":
print("Własny")
else:
print("Inny")
Alternatywę stanowi użycie match-case, wprowadzony w wersji 3.10, którego zdecydowałem się nie opisywać w tej książce. Zainteresowanym polecam doczytać na jego temat.
W instrukcji if Python sprawdza kolejne części i dla pierwszej, dla której będzie spełniony, wywoła jej blok kodu. Po tym sprawdzanie się kończy. Więc jeśli mamy blok else, to zawsze wywoła się dokładnie jedno ciało. Instrukcja if z elif reprezentuje więc różne, wykluczające się alternatywy.
W powyższym przypadku, jeśli tweet_type
będzie równe "promotional"
, to wypisze się tekst "Promowany". Jeśli będzie równe "followed"
, to "Zwykły". Jeśli będzie równe "own"
, to "Własny". Jeśli żadne z powyższych nie jest prawdziwe, to "Inny".
Warto zwrócić uwagę na to, że w instrukcji if tylko jeden blok może zostać wywołany. W poniższym przykładzie wykorzystujemy ten fakt. Pierwszy blok zostanie wywołany, gdy wartość percent
jest większa lub równa 95. Drugi, gdy jest większa lub równa 80 oraz mniejsza niż 95. Trzeci, gdy jest większa lub równa 50 i mniejsza niż 80. Natomiast ostatni tylko wówczas, gdy wartość jest mniejsza niż 50. W związku z tym nigdy nie zobaczymy więcej niż jednej odpowiedzi w tym samym czasie.
print("Czy to jest pewne?")
if percent >= 95:
print("Na 100%")
elif percent >= 80:
print("Raczej tak")
elif percent >= 50:
print("No, powiedzmy")
else:
print("eeee")
Ćwiczenie: else i elif
Napisz kod, który:
- jeśli zmienna
coffee_finished
jestFalse
, to wypisze wyłącznie "Piję kawę", - jeśli zmienna
days_until_deadline
mniejsze od 2, to wypisze wyłącznie "Pracuję", - w przeciwnym wypadku wypisze "Uczę się programowania!".
Sprawdź, jak zachowa się Twój kod dla różnych wartości coffee_finished
(wartość logiczna True
/False
) i days_until_deadline
(wartość liczbowa).
Odpowiedzi na końcu książki.
Ćwiczenie: Warunki
Poniżej przedstawiam cztery warianty wartości zmiennych user_name
i user_age
, oraz trzy fragmenty kodu. Dla każdej pary odpowiedz na pytanie: jak zachowa się dany kod dla określonych wartości zmiennych (udziel łącznie 12 odpowiedzi: dla każdej kombinacji wariantu i fragmentu)?
Wariant pierwszy
user_name = "Michał"
user_age = 31
Wariant drugi
user_name = "Prezes Marek"
user_age = 61
Wariant trzeci
user_name = "Paweł"
user_age = 10
Wariant czwarty
user_name = ""
user_age = 14
Pierwszy fragment kodu - warunek if
if user_name == "Prezes Marek":
print("Witamy Pana Prezesa")
if user_name != "":
print("Cześć " + user_name)
if user_age < 18:
print("Może czekoladkę?")
if user_age >= 18:
print("Może coś do picia?")
Drugi fragment kodu - warunek if z else
if user_name == "Prezes Marek":
print("Witamy Pana Prezesa")
else:
print("Cześć " + user_name)
if user_age < 18:
print("Może czekoladkę?")
else:
print("Może coś do picia?")
Trzeci fragment kodu - warunek if z elif
if user_name == "Prezes Marek":
print("Witamy Pana Prezesa")
elif user_name != "":
print("Cześć " + user_name)
if user_age <= 10:
print("Kategoria: Dzieci")
elif user_age <= 20:
print("Kategoria: Młodzież")
elif user_age <= 60:
print("Kategoria: Dorośli")
else:
print("Kategoria: Starsi")
Odpowiedzi na końcu książki.
Słowo "if" moglibyśmy przetłumaczyć na język polski jako "jeśli".
Patrz Słowniczek na samym końcu książki.
Słowo "else" moglibyśmy przetłumaczyć na język polski jako "w przeciwnym wypadku".