Instrukcje warunkowe i porównania w Pythonie
W poprzednim odcinku opowiedziałem o łańcuchach znaków w Pythonie. Dziś trochę więcej główkowania będzie, bo dwa w jednym – w teorii mógłbym rozpisać te tematy osobno, w praktyce szkoda marnować okazję, żeby za jednym zamachem tak dużo wyjaśnić. Ciężko obrazowo pokazać działanie instrukcji warunkowych bez zrozumienia operatorów porównania i logicznych. Jak już ktoś zna C/C++/C#/Javę – nie ma wielkich różnic w samych porównaniach, tylko same ify trochę inaczej wyglądają;)
Operatory porównania (relacyjne)
Znane każdemu z matematyki – ich wynikiem jest typu bool – czyli prawda (True) lub fałsz(False).
==
równy<
mniejszy>
większy<=
mniejszy lub równy>=
większy lub równy!=
nie-równy
Poniżej przykłady dla każdego operatora:
>>> 5 == 5
True
>>> 5 == 6
False
>>> 5 < 7
True
>>> 5 < 3
False
>>> 5 > 3
True
>>> 5 > 7
False
>>> 5 <= 5
True
>>> 5 <= 3
False
>>> 5 >= 3
True
>>> 5 >= 7
False
>>> 5 != 5
False
>>> 5 != 7
True
Operatory logiczne
Kolejnym przydatnym w instrukcjach warunkowych typem operatorów są operatory logiczne:
and
– logiczne i / koniunkcja logicznaor
– logiczne lub / alternatywanot
– logiczne nie / negacja
Operandami czyli argumentami dla tych operatorów są wartości typu boolean – prawda lub fałsz, zero lub jeden. Z pomocą przychodzą tutaj tablice prawdy.
Pokazują one wynik porównania argumentów.
Dla and
zakładając, że x = a and b
:
a | b | x |
0 (False) | 0 (False) | 0 (False) |
0 (False) | 1 (True) | 0 (False) |
1 (True) | 0 (False) | 0 (False) |
1 (True) | 1 (True) | 1 (True) |
Jak widać wynik będzie prawdziwy (True) tylko w przypadku gdy obie strony porównania będą prawdziwe (True).
Dla or
podobnie jak wyżej x = a or b
:
a | b | x |
0 (False) | 0 (False) | 0 (False) |
0 (False) | 1 (True) | 1 (True) |
1 (True) | 0 (False) | 1 (True) |
1 (True) | 1 (True) | 1 (True) |
Oraz ostatni – not
– czyli negacja. Przyjmuje tylko jeden argument i jak nietrudno się domyślić będzie odwróceniem wartości logicznej x = not a
:
a | x |
0 (False) | 1 (True) |
1 (True) | 0 (False) |
I kilka przykładów:
>>> a = True
>>> b = False
>>> x = a or b
>>> print(x)
True
>>> x = a and b
>>> print(x)
False
>>> x = not a
>>> print(x)
False
Instrukcje warunkowe – if
Kiedy już znamy wymienione wyżej operatory możemy śmiało brać się za poznanie ifów.
If
czyli z angielskiego jeżeli – po tej komendzie podajemy warunek, po nim dwukropek a poniżej z wcięciem instrukcje do wykonania gdy warunek został spełniony. Przy czym warunek ten może być prawdziwym porównaniem np. liczb lub łańcuchów jak i prawdziwym wynikiem logicznym (True):
>>> rok = 1998
>>> if rok > 1900 and rok <=2000:
>>> print("Wiek XX")
Wiek XX
>>> imie = "Kunegunda"
>>> if imie == "Kunegunda":
>>> print("Tak to ona!")
Tak to ona!
>>> sama_prawda = True
>>> if sama_prawda:
>>> print("Prawda prawda!")
Prawda prawda!
OK, fajnie jest, możemy sobie różne rzeczy sprawdzać. A co gdybyśmy chcieli dać jakąś odpowiedź lub wykonać instrukcję w przypadku gdy warunek nie został spełniony?
Instrukcje warunkowe – if...else
Dodajemy instrukcję else – na nasze w przeciwnym razie – pamiętamy też, że wcięcie else powinno być na tym samym poziomie co if, po którym wystąpiło:
>>> rok = 2001
>>> if rok > 1900 and rok <= 2000:
>>> print("Wiek XX")
>>> else:
>>> print("To nie jest XX wiek")
imie = "Brunhilda"
>>> if imie == "Kunegunda":
>>> print("Tak to ona!")
>>> else:
>>> print("Nie, to nie ona.")
Nie, to nie ona.
>>> sama_prawda = False
>>> if sama_prawda:
>>> print("Sama prawda!")
>>> else:
>>> print("Prawda nie jest sama, przyszła z kolegami.")
Prawda nie jest sama, przyszła z kolegami.
Instrukcje warunkowe – if...elif...else
Do instrukcji warunkowych możemy dodać jeszcze jeden typ elif
czyli zbitek else
oraz if
. Dzięki temu możemy budować bardziej wyrafinowane porównania, gdzie sprawdzamy więcej opcji niż w przykładach powyżej. Za pomocą elif
możemy wyłapać specyficzne warunki a na koniec w else
obsłużyć wszystko, co nie spełniło wcześniejszych warunków.
W przypadku bardziej skomplikowanych warunków dobrze sobie rozrysować schemat blokowy działania programu:

Łatwiej później połapać się w kodzie:
>>> rok = 1998
>>> if rok > 1900 and rok <= 2000:
>>> print("Wiek XX")
>>> elif rok <= 1900:
>>> print("Przed XX wiekiem")
>>> else:
>>> print("XIX wiek i dalej")
Wiek XX
>>> rok = 1899
>>> if rok > 1900 and rok <= 2000:
>>> print("Wiek XX")
>>> elif rok <= 1900:
>>> print("Przed XX wiekiem")
>>> else:
>>> print("XIX wiek i dalej")
Przed XX wiekiem
>>> rok = 2001
>>> if rok > 1900 and rok <= 2000:
>>> print("Wiek XX")
>>> elif rok <= 1900:
>>> print("Przed XX wiekiem")
>>> else:
>>> print("XXI wiek i dalej")
XXI wiek i dalej
Priorytety operatorów
Zostało jeszcze kilka drobnych zagadnień powiązanych z tematem dzisiejszego wpisu, ale opiszę je w przyszłości. Na początek wystarczy.
Co na pewno jako dodatek do tej lekcji polecam dodać sobie poniższą tabelkę/link do notatek – są to: priorytety operatorów. Jeżeli nie doprecyzujemy bloków warunku nawiasami obowiązuje następująca ważność operatorów (wiem, że jest tego więcej niż omówiłem, ale serio zapisz w notatkach, przyda się):
Operator | Opis |
---|---|
lambda | Wyrażenie lambda |
or | Logiczne OR (lub) |
and | Logiczne AND (i) |
not x | Logiczne NOT (nie) |
in, not in | Testy przynależności |
is, is not | Testy tożsamości |
< , <= , > , >= , <> , != , == | Porównania |
| | Bitowe OR (lub) |
^ | Bitowe XOR (różnica symetryczna) |
& | Bitowe AND (i) |
< < , > > | Przesunięcia |
+ , - | Dodawanie i odejmowanie |
* , / , % | Mnożenie, dzielenie, reszta z dzielenia |
+x , -x | Identyczność, negacja |
~x | Bitowe NOT (nie) |
** | Potęgowanie |
x.atrybut | Odwołanie do atrybutu |
x[indeks] | Odwołanie do indeksu |
x[indeks:indeks] | Wykrojenie |
f(argumenty...) | Wywołanie funkcji |
(wyrażenia...) | Powiązanie lub drukowalna forma krotki |
[wyrażenia...] | Drukowalna forma listy |
{klucz:dana...} | Drukowalna forma słownika |
`wyrażenia...` | Konwersja napisowa |
To tyle na dzisiaj. Będę wdzięczny za komentarz – czy taka długość wpisów jest OK? Czy może krótsze, bardziej rozbite powinny być? Czy przykładów jest wystarczająco, czy może dodawać więcej życiowych?
W następnym odcinku opowiadam o listach w Pyhonie.
Aktualizacje artykułu:
2023.07.24 – dodany schemat blokowy
w sam raz jest taka długość.
dzięki.