Operatory logiczne
Wstęp
Do tworzenia złożonych warunków można użyć operatorów logicznych. Na przykład, weryfikacja hasła wymaga sprawdzenia długości hasła oraz występowania wymaganych znaków (jak cyfry, wielkie litery czy znaki specjalne).
Wartości logiczne
Zacznijmy od poznania wartości logicznych: prawdy (True) oraz fałszu (False), które są jednocześnie najprostszymi warunkami (wyrażeniami logicznymi). Na przykład, po wpisaniu:
if True:
print("Prawda")
na ekranie zobaczysz napis “Prawda”. Natomiast w przypadku:
if False:
print("Falsz")
nic nie pojawi się na ekranie, ponieważ warunek nie jest spełniony.
Wartości logiczne a zmienne
Wartości logiczne oraz wyniki wyrażeń logicznych można przechowywać w zmiennych. Przykładowo:
czy_poprawne_haslo = True
czy_dobry_wiek = False
czy_pelnoletni = wiek >= 18
czy_poprawny_PIN = PIN == 1234
Zmienna czy_pelnoletni będzie przechowywała wartość True, jeśli w momencie jej tworzenia warunek wiek >= 18 jest prawdziwy, lub False w przeciwnym przypadku. Utworzone zmienne można wykorzystać w instrukcji warunkowej. Na przykład:
if czy_poprawny_PIN:
print("Poprawny PIN")
and (koniunkcja)
Załóżmy, że chcemy sprawdzić, czy zmienna liczba zawiera wartość z przedziału od 10 do 20. Niestety nie znamy jednego operatora, który umożliwiłby sprawdzenie takiego warunku. Możemy natomiast podzielić warunek na dwie prostsze części: liczba ma wartość przynajmniej 10 oraz liczba jest nie większa niż 20. Jeśli obie te części będą jednocześnie spełnione, wtedy cały warunek będzie prawdziwy. Do ich połączenia wykorzystamy operator logiczny and.
if liczba >= 10 and liczba <= 20:
print("Liczba jest z przedzialu od 10 do 20.")
Zobaczmy jak wygląda połączenie dwóch warunków za pomocą operatora logicznego and:
działanie | wynik |
True and True | True |
True and False | False |
False and True | False |
False and False | False |
or (alternatywa)
Załóżmy, że chcemy sprawdzić, czy zmienna dzien_tygodnia określa dzień w weekend (sobotę lub niedzielę). Tutaj również podzielimy warunek na dwie części: dzien_tygodnia to sobota lub dzien_tygodnia to niedziela. Jeśli przynajmniej jedna z części będzie spełniona, wtedy cały warunek będzie prawdziwy. Do ich połączenia wykorzystamy operator logiczny or.
if dzien_tygodnia == "sobota" or dzien_tygodnia == "niedziela":
print("Mamy weekend!")
Połączenie dwóch warunków za pomocą operatora logicznego or:
działanie | wynik |
True or True | True |
True or False | True |
False or True | True |
False or False | False |
not (negacja)
Przyjmijmy, że w zmiennej poprawne przechowujemy informację o poprawności hasła (True oznacza poprawne hasło, zaś False - niepoprawne hasło). Załóżmy, że chcemy teraz zapisać warunek umożliwiający sprawdzenie, czy hasło jest niepoprawne. Możemy skorzystać z operatorów porównania: poprawne == False lub poprawne != True.
Jest jednak bardziej elegancki i czytelny sposób. Możemy wykorzystać operator logiczny not, który zapisujemy przed wartością, którą chcemy zanegować (tj. zmienić jej wartość z True na False lub odwrotnie). Warunek może więc wyglądać następująco:
if not poprawne:
print("Niepoprawne haslo")
Przy użyciu operatora logicznego not można też na przykład sprawdzić, czy osoba logująca się do systemu to ktoś inny niż "Adam" i "Julia":
if not (imie == "Adam" or imie == "Julia"):
print("Nieuprawniona osoba!")
Łączenie wielu warunków
Możemy połączyć wiele warunków w jeden za pomocą operatora and lub or. Na przykład, jeśli chcemy sprawdzić, czy podane słowo jest poprawną porą roku, możemy zapisać następujący warunek:
if s == "wiosna" or s == "lato" or s == "jesien" or s == "zima":
print("Poprawna pora roku!")
Operatory and i or są leniwe. Oznacza to, że podczas obliczania warunku od lewej do prawej, jeśli w pewnym kroku wynik całego warunku jest już znany, pozostałe części są pomijane. W powyższym przykładzie, jeśli s byłoby równe “lato”, wówczas po sprawdzeniu drugiej części (tj. s == "lato"), wiadomo już, że cały warunek jest prawdziwy. W takim przypadku sprawdzanie pozostałych dwóch części zostaje pominięte.
Rozważmy warunek sprawdzający, czy każda z trzech liczb x, y, z jest parzysta.
if x % 2 == 0 and y % 2 == 0 and z % 2 == 0:
print("Wszystkie liczby parzyste!")
Warunki są obliczane od lewej do prawej. Jeśli któraś z liczb będzie nieparzysta, wówczas pomijane są kolejne sprawdzenia, a cały warunek nie jest spełniony.
Kolejność wykonywania operacji
W artykule "Operatory matematyczne" poznaliśmy kolejność wykonywania działań matematycznych. Teraz pula operacji, które znamy, powiększyła się o operatory porównania oraz operatory logiczne. Działania wykonywane są w Pythonie w określonym porządku. Największy priorytet mają nawiasy, które umożliwiają wymuszenie kolejności wykonywania operacji. Następnie obliczane są działania matematyczne (wg kolejności, którą poznaliśmy), a zaraz potem są wykonywane porównania (od lewej do prawej). Najmniejszy priorytet mają operatory logiczne, jednak wśród nich również obowiązuje kolejność. Najwyższy priorytet ma operator not, następnie and, a najniższy priorytet ma or.
Załóżmy, że chcielibyśmy sprawdzić, czy aktualny czas to "po 14:30" (czas podany jest w dwóch zmiennych: godzina oraz minuta). Sprawdzimy to za pomocą następującego warunku:
godzina > 14 or godzina == 14 and minuta > 30
Kiedy używamy kilku operatorów logicznych, warto stosować nawiasy (nawet jeśli pamiętamy priorytety poszczególnych operatorów). Zamykając w nawiasach kolejne operacje, będziemy mieć pewność, że zostaną one wykonane w założonej przez nas kolejności. Powyższy warunek wyglądałby wtedy tak:
godzina > 14 or (godzina == 14 and minuta > 30)
Trenuj z nami!
Pisanie programów jest bardzo ważnym elementem nauki programowania. Możesz to robić rozwiązując zadania (mikroprojekty) dostępne na naszej platformie edukacyjnej Codeforia. Rozwiązania są sprawdzane automatycznie, a po chwili od wysłania kodu dowiesz się, czy jest ono poprawne, czy wymaga zmian. Zapraszamy również na regularne zajęcia online, gdzie będziesz mógł/mogła rozwijać się pod okiem doświadczonego trenera.
Zobacz nasze dostępne kursy.