W tym poradniku nauczysz się wykorzystywać operator warunkowy w Pythonie, znany również jako operator trójskładnikowy. Zrozumiesz jego budowę, a przykłady kodu pomogą Ci pojąć jego działanie.
Na początek przeanalizujemy działanie standardowej instrukcji warunkowej if-else, by następnie pokazać, jak uzyskać ten sam efekt za pomocą operatora trójskładnikowego.
Następnie zaprezentujemy szereg przykładów kodowych, a także pokażemy, jak symulować działanie operatora trójskładnikowego w Pythonie, posługując się krotkami i słownikami. Na koniec omówimy konkretne sytuacje, w których użycie operatora trójskładnikowego jest szczególnie zalecane.
Zaczynamy!
Instrukcja warunkowa if-else w Pythonie: przypomnienie
Możesz ćwiczyć kodowanie, uruchamiając interpreter Pythona (REPL) lub korzystając z edytora online, np. na stronie newsblog.pl.
Ogólna konstrukcja instrukcji if-else w Pythonie przedstawia się następująco:
if warunek: # wykonaj to else: # wykonaj tamto
W powyższym schemacie, 'warunek’ jest wyrażeniem logicznym, które jest poddawane ocenie. Jeżeli wynik warunku to Prawda (True), to wykonuje się blok kodu w sekcji 'if’. W przeciwnym przypadku (gdy warunek jest Fałszem – False), aktywuje się kod w bloku 'else’.
Oto przykład, gdzie zmiennej o nazwie 'game_over’ przypisujemy wartość logiczną, zależną od tego, czy wartość zmiennej 'energia’ jest mniejsza lub równa zeru:
- Jeżeli energia <= 0, zmienna 'game_over’ przyjmuje wartość True.
- W przeciwnym wypadku, 'game_over’ ma wartość False.
Poniższy kod pokazuje, jak to osiągnąć za pomocą konstrukcji warunkowej if-else:
energia = -1 if energia <= 0: game_over = True else: game_over = False print(game_over) # True
W tym przykładzie 'energia’ ma wartość -1, co jest mniejsze niż 0. W efekcie 'game_over’ zostaje ustawione na True.
Operator trójskładnikowy w Pythonie: składnia i przykłady
Python oferuje operator warunkowy, działający podobnie do operatora trójskładnikowego spotykanego w językach C i C++. Jego ogólna składnia to:
wyrażenie1 if warunek else wyrażenie2
Rozbierzmy tę konstrukcję:
- ’warunek’: to wyrażenie, które jest poddawane ocenie logicznej.
- ’wyrażenie1′: to wartość lub kod do wykonania, jeśli warunek jest prawdziwy (True).
- ’wyrażenie2′: to wartość lub kod do wykonania, jeśli warunek jest fałszywy (False).
Teraz ustalimy, jak odnieść 'wyrażenie1′, 'wyrażenie2′ i 'warunek’ do ich odpowiedników z konstrukcji if-else.
Łącząc to wszystko, otrzymujemy następujące użycie operatora trójskładnikowego w Pythonie:
game_over = True if energia <= 0 else False print(game_over) # True
Przejdźmy do innego przykładu. Załóżmy, że prowadzisz księgarnię i chcesz przyznawać rabaty klientom na podstawie częstotliwości ich wizyt w ciągu ostatniego roku.
Niech zmienna 'liczbaWizyt’ oznacza liczbę odwiedzin.
- Jeśli 'liczbaWizyt’ > 7, to procent rabatu 'procent_rabatu’ wynosi 20.
- W przeciwnym wypadku 'procent_rabatu’ wynosi 5.
Użyjemy operatora trójskładnikowego do przypisania wartości do zmiennej 'procent_rabatu’.
liczbaWizyt = 10 procent_rabatu = 20 if liczbaWizyt > 7 else 5 print(procent_rabatu) # 20 (ponieważ liczbaWizyt = 10, a to jest > 7)
W dalszej części pokażemy, jak imitować działanie operatora trójskładnikowego, używając krotki i słownika w Pythonie.
Imitacja operatora trójskładnikowego za pomocą krotki w Pythonie
Podobnie jak inne typy iterowalne w Pythonie, krotki są indeksowane od zera. Oznacza to, że jeśli krotka ma dwa elementy, to nazwa_krotki[0] da pierwszy element, a nazwa_krotki[1] – drugi element.
Podstawowe typy danych w Pythonie to liczby całkowite, liczby zmiennoprzecinkowe, ciągi znaków i wartości logiczne. Python umożliwia rzutowanie typów, co pozwala na przedstawienie wartości jednego typu jako równoważnej wartości innego typu.
Uruchom REPL w Pythonie i wykonaj poniższe przykłady. Konwertując liczby całkowite na wartości logiczne, zauważysz:
- bool(0) daje False.
- bool(
) daje True.
>>> bool(0) False >>> bool(1) True >>> bool(-1) True >>> bool(10) True
Podobnie, podczas rzutowania wartości logicznych na liczby całkowite, otrzymujemy:
>>> int(True) 1 >>> int(False) 0
Łącząc rzutowanie typów i indeksowanie, możemy uzyskać:
- Element o indeksie 0 w krotce: wartość używana, gdy warunek jest Fałszem.
- Element o indeksie 1 w krotce: wartość używana, gdy warunek jest Prawdą.
Używając powyższych zasad:
>>> liczbaWizyt = 10 >>> procent_rabatu = (5,20)[liczbaWizyt > 7] >>> procent_rabatu # 20
Tutaj warunek 'liczbaWizyt > 7′ jest True, ponieważ 'liczbaWizyt’ wynosi 10. Ponieważ int(True) wynosi 1, 'procent_rabatu’ przyjmuje wartość 20, czyli element o indeksie 1.
Imitacja operatora trójskładnikowego za pomocą słownika w Pythonie
Możesz użyć True i False jako kluczy słownika, a następnie ustawić 'wyrażenie1′ i 'wyrażenie2′ jako wartości, odpowiadające kluczom True i False.
slownik = {True: wyrażenie1, False: wyrażenie2 }
Co dalej? Teraz, gdy użyjesz 'slownik[warunek]’, to 'wyrażenie1′ odpowiadające kluczowi True zostanie obliczone, jeśli 'warunek’ jest True. A jeśli 'warunek’ jest False, obliczone zostanie 'wyrażenie2′.
Zakodujmy ponownie przykład z 'procent_rabatu’, tym razem używając słownika w Pythonie.
>>> liczbaWizyt = 10 >>> slownik_rabat = {True: 20, False:5} >>> procent_rabatu = slownik_rabat[liczbaWizyt > 7] >>> procent_rabatu # 20
Tutaj 'liczbaWizyt’ = 10, co jest większe niż 7. Zatem warunek 'liczbaWizyt > 7′ jest True. W związku z tym 'slownik_rabat[liczbaWizyt > 7]’ daje 'slownik_rabat[True]’, czyli wartość 20.
Czy zawsze powinniśmy stosować operator trójskładnikowy w Pythonie?
Do tej pory poznaliśmy, jak stosować operator trójskładnikowy. Ale czy powinniśmy go używać zawsze? Otóż, operator trójskładnikowy niekoniecznie jest najlepszym rozwiązaniem we wszystkich przypadkach. W tej części omówimy, kiedy warto preferować operator trójskładnikowy zamiast instrukcji if-else. Zastanowimy się też, kiedy lepszym wyborem będzie instrukcja if-else.
Zwięzłość w porównaniu z blokami if-else
Jak już wspomniano, operator trójskładnikowy w Pythonie jest bardziej zwięzły niż instrukcja if-else. Dlatego można go stosować do sprawdzania warunków i warunkowej oceny wyrażeń na bieżąco.
W poniższym przykładzie 'liczby’ to lista 10 losowo wygenerowanych liczb całkowitych. Dla każdej z tych 10 liczb sprawdzamy, czy jest parzysta, czy nieparzysta. A ocena odbywa się w jednej linii wewnątrz f-stringa.
import random liczby = [random.choice(range(100)) for i in range(10)] for liczba in liczby: print(f"{liczba} jest {'parzysta' if liczba%2==0 else 'nieparzysta'}")
# Przykładowy wynik 0 jest parzysta 56 jest parzysta 6 jest parzysta 53 jest nieparzysta 62 jest parzysta 7 jest nieparzysta 8 jest parzysta 77 jest nieparzysta 41 jest nieparzysta 94 jest parzysta
Operator trójskładnikowy wymaga klauzuli else
Używając instrukcji warunkowych if-else, klauzula 'else’ jest opcjonalna. Rozważmy przykład. Zmienna 'game_over’ jest ustawiana na True, jeśli energia spadnie poniżej zera.
Jednak, jeśli energia jest większa niż zero, zmienna 'game_over’ w ogóle nie zostanie zainicjowana. W takim przypadku próba dostępu do 'game_over’ spowoduje błąd.
energia = 5 if energia <= 0: game_over = True print(f"Czy gra skończona? {game_over}")
Traceback (ostatnie wywołanie): File "operator_trojskładnikowy.py", line 39, inprint(f"Czy gra skończona? {game_over}") NameError: name 'game_over' is not defined
Jednym ze sposobów rozwiązania tego problemu jest inicjalizacja 'game_over’ na False, a następnie zmiana na True, jeśli poziom energii spadnie poniżej zera.
energia = 5 game_over = False if energia <= 0: game_over1 = True print(f"Czy gra skończona? {game_over}")
Natomiast, kiedy korzystamy z odpowiednika powyższego kodu w postaci operatora trójskładnikowego, klauzula 'else’ nie jest opcjonalna. Operator trójskładnikowy wymaga obliczenia wyrażenia, gdy warunek jest Fałszem.
game_over = True if energia <= 0 else False
Jeżeli zmienisz powyższe na 'game_over = True if energia <= 0′, usuwając część 'else’, natkniesz się na błąd składni, jak pokazano:
File "operator_trojskładnikowy.py", line 42 game_over = True if energia <= 0 ^ SyntaxError: invalid syntax
Do sprawdzania wielu warunków, użyj instrukcji if-else
Rozważmy przykład: każde pytanie w zestawie pytań rekrutacyjnych ma przypisaną trudność. W zależności od tej trudności, pytaniu przypisujemy jeden z trzech poziomów: łatwy, średni lub trudny. Załóżmy, że mamy następujące zależności:
Wynik Poziom trudności
Mniej niż 10 Łatwy
Od 10 do 20 Średni
Więcej niż 20 Trudny
Mając dany wynik, można określić poziom trudności, używając operatora trójskładnikowego w Pythonie, w następujący sposób:
wynik = 12 poziom_trudnosci = "łatwy" if wynik < 10 else "trudny" if wynik > 20 else "średni" print(poziom_trudnosci) # średni
Wyrażenie operatora trójskładnikowego w powyższym kodzie przyjmuje formę:
wyrażenie1 if warunek1 else wyrażenie2 if warunek2 else wyrażenie3
Chociaż zwięzłe, jest ono trudne do przeczytania i zrozumienia. Poniższy obraz pokazuje, jak przepływa sterowanie w tym przypadku.
Poniższy fragment kodu przedstawia równoważną implementację z użyciem instrukcji if-else. Jak widzisz, przepływ sterowania jest znacznie łatwiejszy do zrozumienia, a kod jest bardziej czytelny.
if wynik < 10: poziom_trudnosci="łatwy" elif wynik > 20: poziom_trudnosci="trudny" else: poziom_trudnosci="średni" print(poziom_trudnosci)
Dlatego, gdy mamy do czynienia z wieloma warunkami, powinniśmy użyć bloków if-else zamiast operatora trójskładnikowego. Ułatwia to czytanie i zrozumienie kodu.
Dodatkowo, gdy potrzebujemy wykonać wiele instrukcji – zależnie od tego, czy warunek jest True czy False – powinniśmy rozważyć użycie instrukcji if-else.
Podsumowanie
Oto krótkie podsumowanie tego, czego nauczyłeś się w tym poradniku.
- W Pythonie operator trójskładnikowy może być stosowany w następującej formie: 'wyrażenie1 if warunek else wyrażenie2′.
- Możesz imitować działanie operatora trójskładnikowego za pomocą krotek i słowników w Pythonie.
- Chociaż operator trójskładnikowy może być bardziej zwięzłą alternatywą dla bloków if-else, należy zawsze upewnić się, że kod jest czytelny. Aby poprawić czytelność kodu, możesz stosować instrukcje if-else zamiast operatora trójskładnikowego, szczególnie gdy musisz połączyć wiele warunków.
Następnie zapoznaj się z samouczkiem na temat operatorów równości i nierówności w Pythonie.
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.