Unterstützt Python einen Kurzschluss?


Answers

Kurzschlussverhalten im Operator and , or :

Lassen Sie uns zunächst eine nützliche Funktion definieren, um festzustellen, ob etwas ausgeführt wird oder nicht. Eine einfache Funktion, die ein Argument akzeptiert, eine Nachricht ausgibt und die Eingabe unverändert zurückgibt.

>>> def fun(i):
...     print "executed"
...     return i
... 

Man kann das Python-Kurzschlussverhalten von and / or Operatoren im folgenden Beispiel beobachten:

>>> fun(1)
executed
1
>>> 1 or fun(1)    # due to short-circuiting  "executed" not printed
1
>>> 1 and fun(1)   # fun(1) called and "executed" printed 
executed
1
>>> 0 and fun(1)   # due to short-circuiting  "executed" not printed 
0

Hinweis: Die folgenden Werte werden vom Interpreter als falsch angesehen:

        False    None    0    ""    ()    []     {}

Kurzschlußverhalten in der Funktion: any() , all() :

Die python-Funktionen any() und all() unterstützen auch Kurzschlüsse. Wie in den Dokumenten gezeigt; Sie werten jedes Element einer Sequenz in der richtigen Reihenfolge aus, bis ein Ergebnis gefunden wird, das ein vorzeitiges Beenden der Auswertung ermöglicht. Betrachten Sie die folgenden Beispiele, um beide zu verstehen.

Die Funktion any() überprüft, ob ein Element True ist. Es stoppt die Ausführung, sobald ein True gefunden wurde, und gibt True zurück.

>>> any(fun(i) for i in [1, 2, 3, 4])   # bool(1) = True
executed
True
>>> any(fun(i) for i in [0, 2, 3, 4])   
executed                               # bool(0) = False
executed                               # bool(2) = True
True
>>> any(fun(i) for i in [0, 0, 3, 4])
executed
executed
executed
True

Die Funktion all() prüft alle Elemente auf True und beendet die Ausführung, sobald ein False gefunden wird:

>>> all(fun(i) for i in [0, 0, 3, 4])
executed
False
>>> all(fun(i) for i in [1, 0, 3, 4])
executed
executed
False

Kurzschlussverhalten im Chained Comparison:

Außerdem in Python

Vergleiche können beliebig verkettet werden ; zum Beispiel ist x < y <= z äquivalent zu x < y and y <= z , außer dass y nur einmal ausgewertet wird (aber in beiden Fällen wird z nicht ausgewertet, wenn x < y für falsch befunden wird).

>>> 5 > 6 > fun(3)    # same as:  5 > 6 and 6 > fun(3)
False                 # 5 > 6 is False so fun() not called and "executed" NOT printed
>>> 5 < 6 > fun(3)    # 5 < 6 is True 
executed              # fun(3) called and "executed" printed
True
>>> 4 <= 6 > fun(7)   # 4 <= 6 is True  
executed              # fun(3) called and "executed" printed
False
>>> 5 < fun(6) < 3    # only prints "executed" once
executed
False
>>> 5 < fun(6) and fun(6) < 3 # prints "executed" twice, because the second part executes it again
executed
executed
False

Bearbeiten:
Noch ein interessanter Punkt : - Logische and / or Operatoren in Python geben den Wert eines Operanden anstelle eines Booleschen Werts ( True oder False ) zurück. Beispielsweise:

Operation x and y ergibt das Ergebnis, if x is false, then x, else y

Anders als in anderen Sprachen zB && , || Operatoren in C, die entweder 0 oder 1 zurückgeben.

Beispiele:

>>> 3 and 5    # Second operand evaluated and returned 
5                   
>>> 3  and ()
()
>>> () and 5   # Second operand NOT evaluated as first operand () is  false
()             # so first operand returned 

Ähnlich or Operator gibt den bool(value) Wert zurück, für den bool(value) == True sonst richtigster falscher Wert (gemäß Kurzschlussverhalten), Beispiele:

>>> 2 or 5    # left most operand bool(2) == True
2    
>>> 0 or 5    # bool(0) == False and bool(5) == True
5
>>> 0 or ()
()

Also, wie ist das nützlich? Ein Beispiel für eine Anwendung in Practical Python von Magnus Lie Hetland:
Nehmen wir an, ein Benutzer soll seinen Namen eingeben, kann aber auch nichts eingeben. In diesem Fall möchten Sie den Standardwert '<unknown>' . Sie könnten eine if-Anweisung verwenden, aber Sie könnten auch sehr kurz sagen:

In [171]: name = raw_input('Enter Name: ') or '<Unkown>'
Enter Name: 

In [172]: name
Out[172]: '<Unkown>'

Mit anderen Worten, wenn der Rückgabewert von raw_input wahr ist (keine leere Zeichenkette), wird er dem Namen zugewiesen (nichts ändert sich); Andernfalls wird der Standardwert '<unknown>' dem name zugewiesen.

Question

Unterstützt Python das Kurzschließen in booleschen Ausdrücken?