Python Language
Warunkowe
Szukaj…
Wprowadzenie
Wyrażenia warunkowe, obejmujące słowa kluczowe, takie jak if, elif i inne, zapewniają programom Python możliwość wykonywania różnych akcji w zależności od warunku logicznego: True lub False. W tej sekcji omówiono użycie warunków warunkowych Pythona, logiki logicznej i instrukcji trójskładnikowych.
Składnia
- <wyrażenie> if <warunkowe> else <wyrażenie> # Operator trójskładnikowy
if, elif i jeszcze
W Pythonie możesz zdefiniować szereg warunków warunkowych, używając if
dla pierwszego, elif
dla reszty, aż do końcowego (opcjonalnego) else
dla wszystkiego, co nie zostanie złapane przez inne warunki warunkowe.
number = 5
if number > 2:
print("Number is bigger than 2.")
elif number < 2: # Optional clause (you can have multiple elifs)
print("Number is smaller than 2.")
else: # Optional clause (you can only have one else)
print("Number is 2.")
Number is bigger than 2
wyjść Number is bigger than 2
Użycie else if
zamiast elif
spowoduje błąd składniowy i jest niedozwolone.
Wyrażenie warunkowe (lub „operator trójskładnikowy”)
Operator trójskładnikowy służy do wstawiania wyrażeń warunkowych. Najlepiej stosować go w prostych, zwięzłych operacjach, które można łatwo odczytać.
- Kolejność argumentów różni się od wielu innych języków (takich jak C, Ruby, Java itp.), Co może prowadzić do błędów, gdy ludzie nieznający „zaskakującego” zachowania Pythona używają go (mogą odwrócić kolejność).
- Niektórzy uważają to za „nieporęczne”, ponieważ jest sprzeczne z normalnym przepływem myśli (najpierw myślenie o stanie, a potem o skutkach).
n = 5
"Greater than 2" if n > 2 else "Smaller than or equal to 2"
# Out: 'Greater than 2'
Wynik tego wyrażenia będzie taki, jak odczytywany jest w języku angielskim - jeśli wyrażenie warunkowe ma wartość Prawda, wówczas zostanie ocenione na wyrażenie po lewej stronie, w przeciwnym razie po prawej stronie.
Można również zagnieżdżać operacje na tabeli, jak tutaj:
n = 5
"Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"
Zapewniają również metodę włączania warunków do funkcji lambda .
Jeśli oświadczenie
if condition:
body
Instrukcje if
sprawdzają warunek. Jeśli ma wartość True
, wykonuje treść instrukcji if
. Jeśli oceni na False
, pomija ciało.
if True:
print "It is true!"
>> It is true!
if False:
print "This won't get printed.."
Warunkiem może być dowolne prawidłowe wyrażenie:
if 2 + 2 == 4:
print "I know math!"
>> I know math!
Inne oświadczenie
if condition:
body
else:
body
Instrukcja else wykona swoje ciało tylko wtedy, gdy wszystkie poprzednie instrukcje warunkowe będą miały wartość False.
if True:
print "It is true!"
else:
print "This won't get printed.."
# Output: It is true!
if False:
print "This won't get printed.."
else:
print "It is false!"
# Output: It is false!
Logiczne wyrażenia logiczne
Wyrażenia logiczne logiczne, oprócz wartościowania True
lub False
, zwracają wartość, która została zinterpretowana jako True
lub False
. Jest to Pythoński sposób reprezentowania logiki, który w innym przypadku wymagałby testu if-else.
I operator
Operator and
ocenia wszystkie wyrażenia i zwraca ostatnie wyrażenie, jeśli wszystkie wyrażenia mają wartość True
. W przeciwnym razie zwraca pierwszą wartość, która ma wartość False
:
>>> 1 and 2
2
>>> 1 and 0
0
>>> 1 and "Hello World"
"Hello World"
>>> "" and "Pancakes"
""
Lub operator
Operator or
ocenia wyrażenia od lewej do prawej i zwraca pierwszą wartość, która zwraca wartość True
lub ostatnią wartość (jeśli żadna nie ma wartości True
).
>>> 1 or 2
1
>>> None or 1
1
>>> 0 or []
[]
Leniwa ocena
Korzystając z tego podejścia, pamiętaj, że ocena jest leniwa. Wyrażenia, które nie wymagają oceny w celu ustalenia wyniku, nie są oceniane. Na przykład:
>>> def print_me():
print('I am here!')
>>> 0 and print_me()
0
W powyższym przykładzie print_me
nigdy nie jest wykonywane, ponieważ Python może stwierdzić, że całe wyrażenie ma wartość False
gdy napotka 0
( False
). Należy o tym pamiętać, jeśli print_me
musi zostać wykonane, aby obsługiwać logikę programu.
Testowanie wielu warunków
Częstym błędem podczas sprawdzania wielu warunków jest nieprawidłowe stosowanie logiki.
W tym przykładzie próbuje się sprawdzić, czy każda z dwóch zmiennych jest większa niż 2. Instrukcja jest oceniana jako - if (a) and (b > 2)
. Daje to nieoczekiwany wynik, ponieważ bool(a)
ocenia się jako True
gdy a
nie jest zerem.
>>> a = 1
>>> b = 6
>>> if a and b > 2:
... print('yes')
... else:
... print('no')
yes
Każdą zmienną należy porównać osobno.
>>> if a > 2 and b > 2:
... print('yes')
... else:
... print('no')
no
Kolejny podobny błąd popełniany jest podczas sprawdzania, czy zmienna jest jedną z wielu wartości. Instrukcja w tym przykładzie jest oceniana jako - if (a == 3) or (4) or (6)
. Daje to nieoczekiwany wynik, ponieważ bool(4)
i bool(6)
wartość True
>>> a = 1
>>> if a == 3 or 4 or 6:
... print('yes')
... else:
... print('no')
yes
Ponownie każde porównanie musi być wykonane osobno
>>> if a == 3 or a == 4 or a == 6:
... print('yes')
... else:
... print('no')
no
Korzystanie z operatora in jest kanonicznym sposobem na napisanie tego.
>>> if a in (3, 4, 6):
... print('yes')
... else:
... print('no')
no
Wartości prawdy
Poniższe wartości są uważane za falsey, ponieważ oceniają na False
gdy zostaną zastosowane do operatora logicznego.
- Żaden
- Fałszywy
-
0
lub dowolna wartość liczbowa równoważna zeru, na przykład0L
,0.0
,0j
- Puste sekwencje:
''
,""
,()
,[]
- Puste mapowania:
{}
- Typy zdefiniowane przez użytkownika, w których metody
__bool__
lub__len__
zwracają 0 lubFalse
Wszystkie pozostałe wartości w Pythonie mają wartość True
.
Uwaga: Częstym błędem jest po prostu sprawdzenie fałszywości operacji, która zwraca różne wartości Falsey tam, gdzie różnica ma znaczenie. Na przykład użycie if foo()
zamiast bardziej wyraźnego, if foo() is None
Korzystanie z funkcji cmp w celu uzyskania wyniku porównania dwóch obiektów
Python 2 zawiera funkcję cmp
która pozwala określić, czy jeden obiekt jest mniejszy, równy lub większy niż inny obiekt. Tej funkcji można użyć do wybrania opcji z listy na podstawie jednej z tych trzech opcji.
Załóżmy, że musisz wydrukować 'greater than'
jeśli x > y
, 'less than'
jeśli x < y
i 'equal'
jeśli x == y
.
['equal', 'greater than', 'less than', ][cmp(x,y)]
# x,y = 1,1 output: 'equal'
# x,y = 1,2 output: 'less than'
# x,y = 2,1 output: 'greater than'
cmp(x,y)
zwraca następujące wartości
Porównanie | Wynik |
---|---|
x <y | -1 |
x == y | 0 |
x> y | 1 |
Ta funkcja została usunięta w Pythonie 3. Możesz użyć cmp_to_key(func)
pomocniczej cmp_to_key(func)
znajdującej się w functools
w Pythonie 3, aby przekonwertować stare funkcje porównania na kluczowe.
Ocena wyrażeń warunkowych przy użyciu listowego zrozumienia
Python umożliwia zhakowanie wyrażeń listowych w celu oceny wyrażeń warunkowych.
Na przykład,
[value_false, value_true][<conditional-test>]
Przykład:
>> n = 16
>> print [10, 20][n <= 15]
10
Tutaj n<=15
zwraca False
(co w Pythonie odpowiada 0). Python ocenia więc:
[10, 20][n <= 15]
==> [10, 20][False]
==> [10, 20][0] #False==0, True==1 (Check Boolean Equivalencies in Python)
==> 10
Wbudowana metoda __cmp__
zwróciła 3 możliwe wartości: 0, 1, -1, gdzie cmp (x, y) zwrócił 0: jeśli oba obiekty były takie same 1: x> y -1: x <y
Można tego użyć ze zrozumieniem listy, aby zwrócić pierwszy (tj. Indeks 0), drugi (tj. Indeks 1) i ostatni (tj. Indeks -1) element listy. Dając nam warunek tego typu:
[value_equals, value_greater, value_less][<conditional-test>]
Wreszcie we wszystkich powyższych przykładach Python ocenia obie gałęzie przed wybraniem jednej. Aby ocenić tylko wybraną gałąź:
[lambda: value_false, lambda: value_true][<test>]()
gdzie dodanie ()
na końcu zapewnia, że funkcje lambda są wywoływane / oceniane tylko na końcu. Dlatego oceniamy tylko wybraną gałąź.
Przykład:
count = [lambda:0, lambda:N+1][count==N]()
Testowanie, czy obiektem jest Brak i przypisywanie go
Często będziesz chciał przypisać coś do obiektu, jeśli jest to None
, co oznacza, że nie został przypisany. Użyjemy aDate
.
Najprostszym sposobem na to jest użycie testu is None
.
if aDate is None:
aDate=datetime.date.today()
(Zauważ, że bardziej Pythońskim jest twierdzenie, że is None
zamiast == None
.)
Ale można to nieco zoptymalizować, wykorzystując pojęcie, że not None
oceni wartość True
na wyrażenie logiczne. Poniższy kod jest równoważny:
if not aDate:
aDate=datetime.date.today()
Ale istnieje bardziej Pythoniczny sposób. Poniższy kod jest również równoważny:
aDate=aDate or datetime.date.today()
Dokonuje to oceny zwarcia . Jeśli zainicjowana jest aDate
a i not None
jest not None
, wówczas zostaje przypisana do siebie bez efektu netto. Jeśli jest is None
, to aDate
datetime.date.today()
zostaje przypisana do aDate
.