Ich versuche Python zu lernen und bin auf einen Code gestoßen, der nett und kurz ist, aber keinen Sinn ergibt
Der Kontext war:
def fn(*args):
return len(args) and max(args)-min(args)
Ich verstehe, was es tut, aber warum macht Python das - dh gibt den Wert zurück und nicht True / False?
10 and 7-2
gibt 5 zurück. Ebenso führt das Ändern von und zu oder zu einer Änderung der Funktionalität. So
10 or 7 - 2
Würde 10 zurückgeben.
Ist das ein legitimer / verlässlicher Stil oder gibt es irgendwelche Fallstricke?
python
operators
logical-operators
Marcin
quelle
quelle
and
(sowieor
) ist nicht darauf beschränkt, mit booleschen Werten zu arbeiten oder diese zurückzugeben.None
oder eine Ausnahme)0
nicht sagen kann, obargs
es leer oder nicht leer war, aber alle Elemente gleich waren.Antworten:
TL; DR
Wir fassen zunächst die beiden Verhaltensweisen der beiden logischen Operatoren
and
und zusammenor
. Diese Redewendungen bilden die Grundlage unserer nachfolgenden Diskussion.Das Verhalten ist auch in den Dokumenten zusammengefasst , insbesondere in dieser Tabelle:
Der einzige Operator, der unabhängig von seinen Operanden einen booleschen Wert zurückgibt, ist der
not
Operator."Truthiness" - und "Truthy" -Bewertungen
Die Aussage
Ist eine sehr
pythonische,prägnante (undwahrscheinlichweniger lesbare) Art zu sagen: "Wennargs
nicht leer, geben Sie das Ergebnis von zurückmax(args) - min(args)
", andernfalls kehren Sie zurück0
. Im Allgemeinen ist es eine präzisere Darstellung einesif-else
Ausdrucks. Beispielsweise,Sollte (grob) bedeuten:
Oder gleichwertig,
Ähnlich,
Ist äquivalent zu,
Wo
exp1
undexp2
sind beliebige Python-Objekte oder Ausdrücke, die ein Objekt zurückgeben. Der Schlüssel zum Verständnis der Verwendung der Logikand
und deror
Operatoren besteht darin, zu verstehen, dass sie nicht darauf beschränkt sind, boolesche Werte zu bearbeiten oder zurückzugeben. Hier kann jedes Objekt mit einem Wahrheitswert getestet werden. Dazu gehört auchint
,str
,list
,dict
,tuple
,set
,NoneType
, und Benutzerobjekte definiert. Auch die Kurzschlussregeln gelten weiterhin.Aber was ist Wahrhaftigkeit?
Es bezieht sich darauf, wie Objekte ausgewertet werden, wenn sie in bedingten Ausdrücken verwendet werden. @Patrick Haugh fasst die Wahrhaftigkeit in diesem Beitrag gut zusammen .
Wie
and
funktioniertWir bauen auf der Frage von OP auf, um eine Diskussion darüber zu führen, wie diese Operatoren in diesen Fällen vorgehen.
Das Minimum und Maximum zu finden ist einfach (nutzen Sie die eingebauten Funktionen!). Der einzige Nachteil hierbei ist die angemessene Behandlung des Eckfalls, in dem die Argumentliste leer sein könnte (z. B. Aufruf
foo()
). Dank desand
Betreibers können wir beides in einer einzigen Zeile erledigen :Da
and
verwendet wird, muss der zweite Ausdruck auch ausgewertet werden, wenn der erste istTrue
. Beachten Sie, dass der Rückgabewert immer das Ergebnis des zweiten Ausdrucks ist, wenn der erste Ausdruck als wahr bewertet wird . Wenn der erste Ausdruck als falsch bewertet wird, ist das zurückgegebene Ergebnis das Ergebnis des ersten Ausdrucks.In der obigen Funktion ist If,
foo
das ein oder mehrere Argumente empfängt,len(args)
größer als0
(eine positive Zahl), sodass das zurückgegebene Ergebnis lautetmax(args) - min(args)
. OTOH, wenn keine Argumente übergeben werden,len(args)
ist0
die Falsy ist und0
zurückgegeben wird.Beachten Sie, dass eine alternative Möglichkeit zum Schreiben dieser Funktion Folgendes wäre:
Oder genauer gesagt:
Wenn natürlich keine dieser Funktionen eine Typprüfung durchführt, verlassen Sie sich nicht auf die Einfachheit dieser Konstrukte , es sei denn, Sie vertrauen vollständig auf die bereitgestellten Eingaben .
Wie
or
funktioniertIch erkläre die Arbeitsweise
or
auf ähnliche Weise anhand eines erfundenen Beispiels.Wir verwenden
or
hier den Eckfall. Wir definierenfoo
als:foo
führt eine Filterung der Liste durch, um alle Zahlen beizubehalten9000
. Wenn es solche Zahlen gibt, ist das Ergebnis des Listenverständnisses eine nicht leere Liste, die Truthy ist, also wird sie zurückgegeben (Kurzschluss in Aktion hier). Wenn es keine solchen Zahlen gibt, ist das Ergebnis der[]
Listenkompensation Falsy. Der zweite Ausdruck wird nun ausgewertet (eine nicht leere Zeichenfolge) und zurückgegeben.Unter Verwendung von Bedingungen könnten wir diese Funktion wie folgt umschreiben:
Nach wie vor ist diese Struktur hinsichtlich der Fehlerbehandlung flexibler.
quelle
if ... else (if ... else (if ... else (if ... else ...)))
kann es genauso gut umgeschrieben werden wie... and ... and ... and ... and ...
und an diesem Punkt wird es wirklich schwierig, die Lesbarkeit für beide Fälle zu argumentieren.Zitieren aus Python Docs
Auf diese Weise wurde Python entwickelt, um die booleschen Ausdrücke auszuwerten. Die obige Dokumentation gibt uns einen Einblick, warum sie dies getan haben.
Um einen booleschen Wert zu erhalten, geben Sie ihn einfach ein.
Warum?
Kurzschluss.
Beispielsweise:
Das Gleiche gilt auch für
or
das heißt, es wird den Ausdruck " Wahrheit" zurückgeben , sobald er gefunden wird, da die Auswertung des restlichen Ausdrucks überflüssig ist.Anstatt Hardcore
True
oder zurückzugebenFalse
, gibt Python Truthy oder Falsey zurück , die ohnehin zuTrue
oder ausgewertet werdenFalse
. Sie können den Ausdruck unverändert verwenden, und er funktioniert weiterhin.Um zu wissen, was Truthy und Falsey sind , überprüfen Sie die Antwort von Patrick Haugh
quelle
und und oder führen eine boolesche Logik durch, aber sie geben beim Vergleich einen der tatsächlichen Werte zurück. Bei Verwendung von und werden Werte in einem booleschen Kontext von links nach rechts ausgewertet. 0, '', [], (), {} und None sind in einem booleschen Kontext falsch; alles andere ist wahr.
Wenn alle Werte in einem booleschen Kontext wahr sind und den letzten Wert zurückgeben.
Wenn ein Wert in einem booleschen Kontext falsch ist und den ersten falschen Wert zurückgibt.
Also der Code
Gibt den Wert ,
max(args)-min(args)
wenn es args sonst kehrtlen(args)
die 0 ist.quelle
Dies ist legitim, es handelt sich um eine Kurzschlussauswertung, bei der der letzte Wert zurückgegeben wird.
Sie liefern ein gutes Beispiel. Die Funktion wird zurückgegeben,
0
wenn keine Argumente übergeben werden, und der Code muss nicht nach einem Sonderfall suchen, in dem keine Argumente übergeben wurden.Eine andere Möglichkeit, dies zu verwenden, besteht darin, None-Argumente standardmäßig einem veränderlichen Grundelement wie einer leeren Liste zuzuweisen:
Wenn ein nicht wahrheitsgemäßer Wert an
alist
ihn übergeben wird, wird standardmäßig eine leere Liste verwendet. Dies ist eine praktische Möglichkeit, um eineif
Anweisung und die veränderbare Standardargument -Falle zu vermeidenquelle
Fallstricke
Ja, es gibt ein paar Fallstricke.
fn() == fn(3) == fn(4, 4)
Erstens, wenn
fn
zurückgegeben wird0
, können Sie nicht wissen, ob es ohne Parameter, mit einem Parameter oder mit mehreren gleichen Parametern aufgerufen wurde:Was heißt
fn
dasDann ist Python eine dynamische Sprache. Es ist nirgendwo festgelegt, was
fn
funktioniert, wie seine Eingabe sein soll und wie seine Ausgabe aussehen soll. Daher ist es sehr wichtig, die Funktion richtig zu benennen. Ebenso müssen Argumente nicht aufgerufen werdenargs
.delta(*numbers)
odercalculate_range(*numbers)
könnte besser beschreiben, was die Funktion tun soll.Argumentfehler
Schließlich soll der logische
and
Operator verhindern, dass die Funktion fehlschlägt, wenn sie ohne Argument aufgerufen wird. Es schlägt jedoch immer noch fehl, wenn ein Argument keine Zahl ist:Mögliche Alternative
Hier ist eine Möglichkeit, die Funktion gemäß "Einfacher um Vergebung als um Erlaubnis zu bitten" zu schreiben . Prinzip :
Als Beispiel:
Wenn Sie beim
delta
Aufruf ohne Argument wirklich keine Ausnahme auslösen möchten , können Sie einen Wert zurückgeben, der sonst nicht möglich ist (z. B.-1
oderNone
):quelle
Ich möchte dieser Frage hinzufügen, dass sie nicht nur legitim und zuverlässig ist, sondern auch äußerst praktisch. Hier ist ein einfaches Beispiel:
Daher können Sie es wirklich zu Ihrem Vorteil nutzen. Um gewissenhaft zu sein, sehe ich das so:
Or
OperatorDer Python-
or
Operator gibt den ersten Truth-y-Wert oder den letzten Wert zurück und stopptAnd
OperatorDer Python-
and
Operator gibt den ersten False-y-Wert oder den letzten Wert zurück und stopptHinter den Kulissen
In Python werden alle Zahlen mit
True
Ausnahme von 0 interpretiert.ist das gleiche wie:
Welches ist klar
False
. Es ist daher logisch, dass 0 zurückgegeben wirdquelle
Ja. Dies ist das richtige Verhalten und Vergleich.
Zumindest in Python,
A and B
kehrt ,B
wennA
im wesentlichenTrue
auch , wennA
nicht null, nichtNone
kein leerer Behälter (wie zum Beispiel eines leerenlist
,dict
usw.).A
wird zurückgegeben IFFA
ist im WesentlichenFalse
oderNone
oder leer oder null.Auf der anderen Seite,
A or B
kehrt ,A
wennA
im WesentlichenTrue
einschließlich , wennA
nicht NULL ist, NICHTNone
kein leerer Behälter (zB eine leerelist
,dict
usw.), ansonsten gibtB
.Es ist leicht, dieses Verhalten nicht zu bemerken (oder zu übersehen), da in Python jedes
non-null
nicht leere Objekt, das als True ausgewertet wird, wie ein Boolescher Wert behandelt wird.Bei allen folgenden Zeichen wird beispielsweise "True" ausgegeben.
Auf der anderen Seite wird bei allen folgenden Zeichen "Falsch" ausgegeben.
quelle
A
ist im WesentlichenTrue
. Korrigiert.auf einfache Weise zu verstehen,
UND :
if first_val is False return first_val else second_value
z.B:
aber,
und => wenn jemand falsch ist, wird es falsch sein. Wenn beide wahr sind, wird nur es wahr
ODER :
if first_val is False return second_val else first_value
Grund ist, wenn zuerst falsch ist, wird geprüft, ob 2 wahr ist oder nicht.
z.B:
aber,
oder => wenn jemand falsch ist, wird es wahr sein. Wenn also der erste Wert falsch ist, egal welcher Wert angenommen wird. es gibt also den zweiten Wert zurück, was auch immer es sein kann.
Wenn jemand wahr ist, wird es wahr. Wenn beide falsch sind, wird es falsch.
quelle