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 logiczna
  • or – logiczne lub / alternatywa
  • not – logiczne nie / negacja

Operandami czyli argumentami dla tych operatorów są wartości typu booleanprawda 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:

abx
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:

abx
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:

ax
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 warunkoweif

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 warunkoweif...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 warunkoweif...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 
lambdaWyrażenie lambda
orLogiczne OR (lub)
andLogiczne AND (i)
not xLogiczne NOT (nie)
in, not inTesty przynależności
is, is notTesty 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-xIdentyczność, negacja
~xBitowe NOT (nie)
**Potęgowanie
x.atrybutOdwoł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
Priorytety operatorów z oficjalnej dokumentacji na python.org

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

Nie bądź lama, udostępnij;)