Pisanie instrukcji if w jednym wierszu za pomocą operatora trójdzielnego Pythona (operatora warunkowego)

Biznes

Python posiada styl pisania zwany operatorami trójskładnikowymi (operatorami warunkowymi), który umożliwia opisanie procesu takiego jak instrukcja if w jednym wierszu.

Objaśniono tu następujące zagadnienia wraz z przykładowym kodem.

  • Podstawowy zapis operatorów trójskładnikowych
  • if ... elif ... else ...Opisz to w jednym wierszu
  • Łączenie list kompleksowej notacji i operatorów ternarnych
  • Kombinacja funkcji anonimowych (wyrażeń lambda) i operatorów trójdzielnych

Więcej informacji na temat zwykłej instrukcji if można znaleźć w poniższym artykule.

Podstawowy zapis operatorów trójskładnikowych

W języku Python operator trójskładnikowy można zapisać w następujący sposób

Expression evaluated when the conditional expression is true if conditional expression else Expression evaluated when the conditional expression is false

Jeśli chcesz zmieniać wartości w zależności od warunków, po prostu zapisz każdą wartość tak, jak jest.

Value to return if conditional expression is true if conditional expression else Value to return if conditional expression is false
a = 1
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# odd

a = 2
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# even

Jeśli chcesz przełączać przetwarzanie w zależności od warunków, opisz każde wyrażenie.

a = 1
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 3

a = 2
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 4

Dopuszczalne są również wyrażenia, które nie zwracają wartości (wyrażenia zwracające wartość None). W zależności od warunku, jedno z wyrażeń jest obliczane i wykonywany jest proces.

a = 1
print('even') if a % 2 == 0 else print('odd')
# odd

Jest to równoważne następującemu kodowi napisanemu za pomocą zwykłej instrukcji if.

a = 1

if a % 2 == 0:
    print('even')
else:
    print('odd')
# odd

Wiele wyrażeń warunkowych można również łączyć za pomocą operatorów logicznych (i, lub itp.).

a = -2
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# negative and even

a = -1
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# positive or odd

if ... elif ... else ...Jednowierszowy opis

if ... elif ... else ...Nie ma specjalnego sposobu, aby zapisać to w jednym wierszu. Można to jednak zrobić, używając w wyrażeniu innego operatora trójdzielnego, który jest obliczany, gdy wyrażenie warunkowe operatora trójdzielnego jest fałszywe. Obraz zagnieżdżonych operatorów trójdzielnych.

Najlepiej jednak nie używać jej zbyt często, ponieważ zmniejsza ona czytelność.

a = 2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# positive

a = 0
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# zero

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

Poniższe wyrażenie warunkowe można zinterpretować na dwa sposoby, ale traktuje się je jako pierwszy z nich (1).

A if condition 1 else B if condition 2 else C
1. A if condition 1 else ( B if condition 2 else C )
2. ( A if condition 1 else B ) if condition 2 else C 

Konkretny przykład jest następujący. Pierwsze wyrażenie jest traktowane tak, jakby było drugim.

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

result = 'negative' if a < 0 else ('positive' if a > 0 else 'zero')
print(result)
# negative

result = ('negative' if a < 0 else 'positive') if a > 0 else 'zero'
print(result)
# zero

Łączenie list kompleksowej notacji i operatorów ternarnych

Użytecznym zastosowaniem operatora trójskładnikowego jest przetwarzanie list w notacji list comprehension.

Dzięki połączeniu operatora trójskładnikowego i notacji list comprehension możliwe jest zastępowanie elementów listy lub wykonywanie innych operacji w zależności od warunków.

l = ['even' if i % 2 == 0 else i for i in range(10)]
print(l)
# ['even', 1, 'even', 3, 'even', 5, 'even', 7, 'even', 9]
l = [i * 10 if i % 2 == 0 else i for i in range(10)]
print(l)
# [0, 1, 20, 3, 40, 5, 60, 7, 80, 9]

Więcej informacji na temat notacji list comprehension można znaleźć w poniższym artykule.

Kombinacja funkcji anonimowych (wyrażeń lambda) i operatorów trójdzielnych

Przydatny jest operator trójskładnikowy, który można zwięźle opisać nawet w anonimowej funkcji (wyrażeniu lambda).

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Zauważ, że powyższy przykład, choć nie jest związany z operatorem trójskładnikowym, przypisuje nazwę do wyrażenia lambda. W związku z tym narzędzia do automatycznego sprawdzania, takie jak PEP8 – konwencja kodowania Pythona, mogą wygenerować Ostrzeżenie.

Dzieje się tak dlatego, że PEP8 zaleca używanie def przy przypisywaniu nazw do funkcji.

Koncepcja PEP8 jest następująca

  • Wyrażenia lambda są używane do przekazywania obiektów wywoływalnych jako argumentów, na przykład bez nadawania im nazw
  • W wyrażeniach lambda użyj def, aby zdefiniować przez nazwę
Copied title and URL