Jak korzystać z operatora trójskładnikowego Pythona

Photo of author

By maciekx

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, in 
    print(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