Suche…


Einführung

Bedingte Ausdrücke mit Schlüsselwörtern wie if, elif und anderen geben Python-Programmen die Möglichkeit, abhängig von einer booleschen Bedingung verschiedene Aktionen auszuführen: True oder False. In diesem Abschnitt wird die Verwendung von Python-Bedingungen, Booleschen Logik und ternären Anweisungen beschrieben.

Syntax

  • <Ausdruck> wenn <Bedingt> sonst <Ausdruck> # Ternärer Operator

wenn, elif und sonst

In Python können Sie eine Reihe von conditionals mit definieren , if für die ersten, elif für den Rest, bis die endgültigen (optional) else für alles , was nicht von dem anderen conditionals gefangen.

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 Ausgänge Number is bigger than 2

Die Verwendung von else if anstelle von elif löst einen Syntaxfehler aus und ist nicht zulässig.

Bedingter Ausdruck (oder "Der ternäre Operator")

Der ternäre Operator wird für inline bedingte Ausdrücke verwendet. Es wird am besten für einfache, präzise Operationen verwendet, die leicht zu lesen sind.

  • Die Reihenfolge der Argumente unterscheidet sich von vielen anderen Sprachen (wie z. B. C, Ruby, Java usw.). Dies kann zu Fehlern führen, wenn Personen, die mit Pythons "überraschendem" Verhalten nicht vertraut sind, sie verwenden (sie können die Reihenfolge umkehren).
  • Einige finden es "unhandlich", da es dem normalen Gedankenfluss zuwiderläuft (zuerst an den Zustand denken und dann an die Auswirkungen).
n = 5

"Greater than 2" if n > 2 else "Smaller than or equal to 2"
# Out: 'Greater than 2'

Das Ergebnis dieses Ausdrucks wird so sein, wie er auf Englisch gelesen wird. Wenn der Bedingungsausdruck "True" ist, wird der Ausdruck auf der linken Seite ausgewertet, ansonsten auf der rechten Seite.

Tenäre Operationen können auch verschachtelt werden, wie hier:

n = 5
"Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"

Sie bieten auch eine Methode zum Einbinden von Bedingungen in Lambda-Funktionen .

Wenn Aussage

if condition:
    body

Die if Anweisungen prüfen die Bedingung. Wenn es als True ausgewertet wird, führt es den Hauptteil der if Anweisung aus. Wenn es als False ausgewertet wird, wird der Körper übersprungen.

if True:
    print "It is true!"
>> It is true!

if False:
    print "This won't get printed.."

Die Bedingung kann ein beliebiger gültiger Ausdruck sein:

if 2 + 2 == 4:
    print "I know math!"
>> I know math!

Else Aussage

if condition:
    body
else:
    body

Die else-Anweisung führt ihren Rumpf nur dann aus, wenn alle vorausgehenden Bedingungsanweisungen zu False ausgewertet werden.

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!

Boolesche Logikausdrücke

Boolesche Logikausdrücke geben nicht nur True oder False , sondern geben den Wert zurück , der als True oder False interpretiert wurde. Es ist eine Pythonic-Methode, um Logik darzustellen, für die ansonsten ein If-else-Test erforderlich wäre.


Und Betreiber

Der Operator and wertet alle Ausdrücke aus und gibt den letzten Ausdruck zurück, wenn alle Ausdrücke den Wert True . Andernfalls wird der erste Wert zurückgegeben, der den Wert False ergibt:

>>> 1 and 2
2

>>> 1 and 0
0

>>> 1 and "Hello World"
"Hello World"

>>> "" and "Pancakes"
""

Oder Betreiber

Der Operator or wertet die Ausdrücke von links nach rechts aus und gibt den ersten Wert, der den Wert True ergibt, oder den letzten Wert zurück (wenn keiner True ).

>>> 1 or 2
1

>>> None or 1
1

>>> 0 or []
[]

Faule Auswertung

Wenn Sie diesen Ansatz verwenden, denken Sie daran, dass die Auswertung faul ist. Ausdrücke, die zur Ermittlung des Ergebnisses nicht ausgewertet werden müssen, werden nicht ausgewertet. Zum Beispiel:

>>> def print_me():
        print('I am here!')
>>> 0 and print_me()
0

Im obigen Beispiel wird print_me niemals ausgeführt, da Python feststellen kann, dass der gesamte Ausdruck False wenn er auf 0 ( False ) trifft. print_me Sie dies, wenn print_me muss, um Ihre Programmlogik zu bedienen.


Testen auf mehrere Bedingungen

Ein häufiger Fehler bei der Prüfung auf mehrere Bedingungen ist die falsche Anwendung der Logik.

In diesem Beispiel wird geprüft, ob zwei Variablen jeweils größer als 2 sind. Die Anweisung wird als - if (a) and (b > 2) ausgewertet. Dies führt zu einem unerwarteten Ergebnis, da bool(a) als True ausgewertet wird, wenn a nicht Null ist.

>>> a = 1
>>> b = 6
>>> if a and b > 2:
...     print('yes')
... else:
...     print('no')
    
yes

Jede Variable muss separat verglichen werden.

>>> if a > 2 and b > 2:
...     print('yes')
... else:
...     print('no')
        
no

Ein anderer, ähnlicher Fehler wird gemacht, wenn geprüft wird, ob eine Variable einen von mehreren Werten hat. Die Anweisung in diesem Beispiel wird als - if (a == 3) or (4) or (6) ausgewertet. Dies führt zu einem unerwarteten Ergebnis, da bool(4) und bool(6) jeweils True

>>> a = 1
>>> if a == 3 or 4 or 6:
...     print('yes')
... else:
...     print('no')
       
yes

Wieder muss jeder Vergleich separat durchgeführt werden

>>> if a == 3 or a == 4 or a == 6:
...     print('yes')
... else:
...     print('no')
        
no

Die Verwendung des in-Operators ist die kanonische Schreibweise.

>>> if a in (3, 4, 6):
...     print('yes')
... else:
...     print('no')
    
no

Wahrheitswerte

Die folgenden Werte werden als Falsey betrachtet, da sie bei Anwendung auf einen booleschen Operator als False ausgewertet werden.

  • Keiner
  • Falsch
  • 0 oder ein beliebiger numerischer Wert gleich Null, zum Beispiel 0L , 0.0 , 0j
  • Leere Sequenzen: '' , "" , () , []
  • Leere Zuordnungen: {}
  • Benutzerdefinierte Typen, bei denen die Methoden __bool__ oder __len__ 0 oder False

Alle anderen Werte in Python werden mit True ausgewertet.


Hinweis: Ein häufiger Fehler besteht darin, einfach nach der Falschheit einer Operation zu suchen, die verschiedene Falsey-Werte zurückgibt, bei denen der Unterschied von Bedeutung ist. Verwenden Sie zum Beispiel if foo() anstelle des expliziteren if foo() is None

Verwenden der Funktion cmp zum Abrufen des Vergleichsergebnisses zweier Objekte

Python 2 enthält eine cmp Funktion, mit der Sie feststellen können, ob ein Objekt kleiner als ein anderes Objekt ist oder diesem entspricht. Diese Funktion kann verwendet werden, um eine Auswahl aus einer Liste basierend auf einer dieser drei Optionen auszuwählen.

Angenommen, Sie müssen 'greater than' drucken 'greater than' wenn x > y , 'less than' wenn x < y und 'equal' wenn 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) gibt die folgenden Werte zurück

Vergleich Ergebnis
x <y -1
x == y 0
x> y 1

Diese Funktion wird auf Python entfernt 3. Sie können die Verwendung cmp_to_key(func) in sich Helferfunktion functools in Python 3 zu alten Vergleichsfunktionen auf die wichtigsten Funktionen zu konvertieren.

Bedingte Ausdrucksauswertung mit List Comprehensions

Mit Python können Sie Listenverständnisse hacken, um bedingte Ausdrücke auszuwerten.

Zum Beispiel,

[value_false, value_true][<conditional-test>]

Beispiel:

>> n = 16
>> print [10, 20][n <= 15]
10

Hier gibt n<=15 False (was in Python gleich 0 ist). Was Python bewertet, ist also:

[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

Die eingebaute __cmp __cmp__ Methode gab 3 mögliche Werte zurück: 0, 1, -1, wobei cmp (x, y) 0: zurückgab, wenn beide Objekte gleich 1 waren: x> y -1: x <y

Dies könnte bei List Comprehensions verwendet werden, um das erste (dh Index 0), zweite (dh Index 1) und letzte (dh Index -1) Element der Liste zurückzugeben. Geben Sie uns eine Bedingung dieses Typs:

[value_equals, value_greater, value_less][<conditional-test>]

Schließlich wertet Python in allen obigen Beispielen beide Zweige aus, bevor er einen auswählt. Um nur den ausgewählten Zweig auszuwerten:

[lambda: value_false, lambda: value_true][<test>]()

Durch das Hinzufügen von () am Ende wird sichergestellt, dass die Lambda-Funktionen nur am Ende aufgerufen / ausgewertet werden. Daher bewerten wir nur den ausgewählten Zweig.

Beispiel:

count = [lambda:0, lambda:N+1][count==N]()

Testen Sie, ob ein Objekt Keine ist, und weisen Sie es zu

Oft möchten Sie einem Objekt etwas zuweisen, wenn es None ist, um None , dass es noch nicht zugewiesen wurde. Wir werden ein aDate .

Der einfachste Weg, dies zu tun, ist die Verwendung des is None Tests.

if aDate is None:
    aDate=datetime.date.today()

(Beachten Sie, dass es mehr Pythonic ist, um zu sagen, is None statt == None .)

Dies kann jedoch geringfügig optimiert werden, indem die Vorstellung ausgenutzt wird, dass " not None in einem boolschen Ausdruck als " True ausgewertet wird. Der folgende Code ist gleichwertig:

if not aDate:
    aDate=datetime.date.today()

Es gibt aber einen mehr pythonischen Weg. Der folgende Code ist ebenfalls gleichwertig:

aDate=aDate or datetime.date.today()

Dies führt eine Kurzschlussbewertung durch . Wenn aDate initialisiert ist und not None , wird es sich ohne Nettoeffekt zugewiesen. Wenn is None , wird datetime.date.today() einem aDate zugewiesen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow