Jak korzystać z operatora trójskładnikowego Pythona

Ten przewodnik nauczy Cię, jak używać operatora trójskładnikowego w Pythonie. Poznasz składnię i kod kilku przykładów, aby zrozumieć, jak to działa.

Zaczniemy od przyjrzenia się, jak działa instrukcja warunkowa if-else, a następnie nauczymy się pisać równoważne wyrażenie za pomocą operatora trójskładnikowego.

Następnie zakodujemy kilka przykładów, a następnie nauczymy się emulować zachowanie operatora trójskładnikowego Pythona przy użyciu krotki i słownika Pythona. Na koniec przejrzymy kilka przypadków użycia, w których powinieneś preferować użycie operatora trójskładnikowego.

Zaczynajmy!

Instrukcja if-else w Pythonie: przegląd

Możesz kodować razem, uruchamiając Python REPL lub w internetowym edytorze Pythona newsblog.pl.

Ogólna składnia instrukcji if-else w Pythonie jest następująca:

if condition:
    # do this
else:
    # do this

W powyższym fragmencie warunek oznacza warunek do sprawdzenia. Jeśli warunek ma wartość True, uruchamiany jest blok if. Jeśli warunek ma wartość False, wykonywane są instrukcje wewnątrz bloku else.

Oto przykład, w którym zmienna game_over ma przypisaną wartość logiczną w zależności od tego, czy wartość energii jest mniejsza lub równa zeru.

  • Jeśli energia <= 0, game_over ma wartość True.
  • W przeciwnym razie game_over jest fałszywe.

Poniższy fragment kodu pokazuje, jak to zrobić za pomocą instrukcji warunkowych if-else:

energy = -1

if energy <= 0:
    game_over = True
else:
    game_over = False

print(game_over)
# True

W tym przykładzie energia wynosi -1, czyli mniej niż 0. Więc game_over ma wartość True.

Operator trójskładnikowy w Pythonie: składnia i przykłady

Python ma potrójny operator, który działa bardzo podobnie do trójskładnikowego operatora warunkowego w językach takich jak C i C++. Ogólna składnia jej użycia jest następująca:

expression1 if condition else expression2

Przeanalizujmy powyższą składnię:

  • warunek: Warunek do sprawdzenia.
  • wyrażenie1: wyrażenie do oceny, czy warunek jest prawdziwy.
  • wyrażenie2: wyrażenie do oceny, czy warunek jest fałszywy.

Teraz określimy, jakie powinny być wyrażenia 1, wyrażenia 2 i warunek z wersji kodu if-else.

Łącząc to wszystko razem, mamy następujące użycie operatora trójskładnikowego Pythona.

game_over = True if energy <= 0 else False
print(game_over)
# True

Zakodujmy inny przykład. Załóżmy, że prowadzisz księgarnię i dajesz czytelnikom rabat na zakupy w zależności od tego, jak często odwiedzali Twój sklep w ciągu ostatniego roku.

Niech numVisits oznacza liczbę odwiedzin.

  • Jeśli numVisits > 7, procent rabatu, discount_perc wynosi 20.
  • W przeciwnym razie zniżka_perc wynosi 5.

Używamy operatora trójskładnikowego, aby przypisać wartość do zmiennej discount_perc.

numVisits = 10

discount_perc = 20 if numVisits > 7 else 5

print(discount_perc)
# 20 (as numVisits = 10 which is > 7)

Następnie nauczymy się emulować operatora trójskładnikowego przy użyciu krotki Pythona i słownika.

Emulowanie operatora trójskładnikowego za pomocą krotki Pythona

Podobnie jak wszystkie elementy iterowalne w Pythonie, krotki podążają za indeksowaniem zerowym. Więc jeśli masz dwa elementy w krotce, tuple_name[0] oznacza pierwszy element w krotce i nazwa_krotki[1] daje drugi element w krotce.

Podstawowe typy danych w Pythonie to liczby całkowite, zmiennoprzecinkowe, łańcuchowe i logiczne. Python obsługuje rzutowanie typów, które pozwala reprezentować określony typ danych przez jego równoważną reprezentację w innym typie danych.

Uruchom REPL w języku Python i uruchom następujące przykłady. Jeśli spróbujesz przekonwertować liczby całkowite na wartości logiczne, zauważysz, co następuje:

  • bool(0) jest fałszem.
  • bool() zwraca wartość True.
>>> bool(0)
False
>>> bool(1)
True
>>> bool(-1)
True
>>> bool(10)
True

Podobnie, podczas rzutowania wartości Boolean na liczby całkowite, otrzymujemy:

>>> int(True)
1
>>> int(False)
0

Łącząc rzutowanie typów i indeksowanie, możemy wykonać następujące czynności:

  • Element o indeksie 0 w krotce: wartość, która ma być używana, gdy warunek ma wartość False.
  • Element o indeksie 1 w krotce: wartość, która ma być używana, gdy warunek ma wartość True.

Korzystając z powyższego mamy:

>>> numVisits = 10
>>> discount_perc = (5,20)[numVisits > 7]
>>> discount_perc
# 20

Tutaj warunek numVisits > 7 jest True, ponieważ numVisits wynosi 10. Ponieważ int(True) wynosi 1, wartość Discount_perc wynosi 20, element o indeksie 1.

Emulowanie operatora trójskładnikowego za pomocą słownika Pythona

Możesz ustawić True i False jako klucze słownika. I możesz ustawić wyrażenie1 i wyrażenie2 jako wartości odpowiadające odpowiednio kluczom Prawda i Fałsz.

some_dict = {True: expression1,
             False: expression2
            }

Co zrobisz następnie? Teraz, jeśli użyjesz some_dict[condition], wyrażenie1 odpowiadające kluczowi True jest obliczane, jeśli warunek ma wartość True. A wyrażenie2 jest oceniane, gdy warunek jest fałszywy.

Zakodujmy przykład Discount_perc (ponownie), ale tym razem używając słownika Pythona.

>>> numVisits = 10
>>> discount_dict = {True: 20, False:5}
>>> discount_perc = discount_dict[numVisits > 7]
>>> discount_perc
# 20

Tutaj numVisits = 10, co jest większe niż 7. Dlatego warunek numVisits > 7 jest prawdziwy. Więc zniżka_dykt[numVisits > 7] daje zniżkę_dict[True] czyli wartość 20.

Czy zawsze powinieneś używać operatora trójskładnikowego Pythona?

Do tej pory nauczyliśmy się, jak używać operatora trójskładnikowego. Ale czy zawsze powinniśmy używać operatora trójskładnikowego? Cóż, potrójny operator może nie być najlepszym wyborem dla wszystkich przypadków użycia. Ta sekcja rozkłada się, kiedy powinieneś preferować użycie operatora trójskładnikowego zamiast instrukcji if-else. Omówimy również, kiedy powinniśmy rozważyć użycie instrukcji if-else zamiast operatora trójskładnikowego.

Bardziej zwięzłe niż bloki if-else

Jak wspomniano, w Pythonie wyrażenie operatora trójskładnikowego jest bardziej zwięzłe niż instrukcja if-else. W związku z tym można go używać do sprawdzania warunków i warunkowej oceny wyrażeń w locie.

W poniższym przykładzie nums to lista 100 losowo wygenerowanych liczb całkowitych. Dla każdej ze 100 liczb sprawdzamy, czy jest ona parzysta czy nieparzysta. A ta ocena odbywa się w linii wewnątrz struny f.

import random

nums = [random.choice(range(100)) for i in range(10)]

for num in nums:
    print(f"{num} is {'even' if num%2==0 else 'odd'}")
# sample output

0 is even
56 is even
6 is even
53 is odd
62 is even
7 is odd
8 is even
77 is odd
41 is odd
94 is even

Operator trójskładnikowy wymaga klauzuli else

Gdy używasz instrukcji warunkowych if-else, klauzula else jest opcjonalna. Weźmy przykład. Zmienna game_over jest ustawiona na True, jeśli energia spadnie do wartości mniejszej lub równej zeru.

Jeśli jednak energia jest większa od zera, zmienna game_over nigdy nie jest inicjowana. Więc napotkasz błędy, jeśli spróbujesz uzyskać dostęp do zmiennej game_over.

energy = 5
if energy <= 0:
    game_over = True

print(f"Is the game over? {game_over}")
Traceback (most recent call last):
  File "ternary_op.py", line 39, in <module>
    print(f"Is the game over? {game_over}")
NameError: name 'game_over' is not defined

Jednym ze sposobów rozwiązania tego problemu jest początkowe ustawienie game_over na False i zaktualizowanie go na True, jeśli poziom energii jest mniejszy lub równy zeru.

energy = 5
game_over = False
if energy <= 0:
    game_over1 = True

print(f"Is the game over? {game_over}")

Jednakże, gdy używany jest odpowiednik powyższego operatora trójskładnikowego Pythona, klauzula else nie jest opcjonalna. Operator trójskładnikowy wymaga obliczenia wyrażenia, gdy warunek ma wartość Fałsz.

game_over = True if energy <= 0 else False

Jeśli zmienisz powyższe na game_over = True, jeśli energia <= 0, usuwając część else, napotkasz błąd składniowy, jak pokazano:

File "ternary_op.py", line 42
    game_over = True if energy <= 0
                                  ^
SyntaxError: invalid syntax

Aby sprawdzić wiele warunków, użyj instrukcji if-else

Rozważmy przykład: Każde pytanie w zestawie pytań do rozmowy kwalifikacyjnej ma powiązany wynik trudności. W zależności od tego wyniku, do danego pytania przypisujemy jeden z trzech poziomów trudności: łatwy, średni lub trudny. Załóżmy, że mamy następujące:

WynikPoziom trudnościMniej niż 10łatwyOd 10 do 20 średniWięcej niż 20trudny

Biorąc pod uwagę wynik trudności, możesz uzyskać jego poziom trudności za pomocą trójskładnikowego operatora Pythona, jak pokazano:

score = 12

difficulty_level = "easy" if score < 10 else "hard" if score > 20 else "medium"

print(difficulty_level)
# medium

Wyrażenie operatora trójskładnikowego w powyższym bloku kodu ma następującą postać:

expression1 if condition1 else expression2 if condition2 else expression3

Choć zwięzły, jest nieco trudny do odczytania i przeanalizowania. Poniższy obraz pokazuje, jak przebiega przepływ sterowania w tym przypadku.

Poniższy fragment kodu przedstawia równoważną implementację przy użyciu instrukcji if-else. Jak widać, przepływ sterowania jest znacznie łatwiejszy do zrozumienia, a kod jest bardziej czytelny.

if score < 10:
    difficulty_level="easy"
elif score > 20:
    difficulty_level="hard"
else:
    difficulty_level="medium"

print(difficulty_level)

Dlatego, gdy masz wiele warunków, powinieneś użyć bloków if-else zamiast operatora trójskładnikowego. Dzięki temu kod jest łatwy do odczytania i zrozumienia.

Ponadto, gdy trzeba wykonać wiele instrukcji — w zależności od tego, czy warunek jest prawdziwy, czy fałszywy — należy rozważyć użycie instrukcji if-else.

Wniosek

Oto podsumowanie tego, czego nauczyłeś się w tym samouczku.

  • W Pythonie operator trójskładnikowy może być używany z następującą składnią: wyrażenie1 jeśli warunek inny wyrażenie2.
  • Możesz emulować zachowanie operatora trójskładnikowego za pomocą krotek i słowników Pythona.
  • Chociaż operator trójskładnikowy może być bardziej zwięzłą alternatywą dla bloków if-else, należy upewnić się, że kod jest czytelny. Aby poprawić czytelność kodu, możesz użyć instrukcji if-else zamiast operatora trójskładnikowego, zwłaszcza gdy musisz połączyć wiele warunków.

Następnie zapoznaj się z samouczkiem dotyczącym równych i nierównych operatorów w Pythonie.