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.).
- RELATED:Operatory logiczne w języku Python: and, or, not (koniunkcja logiczna, dysjunkcja logiczna, negacja)
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ę