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ład 0L , 0.0 , 0j
  • Puste sekwencje: '' , "" , () , []
  • Puste mapowania: {}
  • Typy zdefiniowane przez użytkownika, w których metody __bool__ lub __len__ zwracają 0 lub False

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
Python 2.x 2.7

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 .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow