Python Language
Conditionals
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 Beispiel0L
,0.0
,0j
- Leere Sequenzen:
''
,""
,()
,[]
- Leere Zuordnungen:
{}
- Benutzerdefinierte Typen, bei denen die Methoden
__bool__
oder__len__
0 oderFalse
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
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.