"Boolesche" Operationen in Python (dh: die und / oder Operatoren)

8

Diese Methode sucht nach der ersten Gruppe von Wortzeichen (zB: [a-zA-Z0-9_] ) und gibt die erste übereinstimmende Gruppe oder None im Falle eines Fehlers zurück.

%Vor%

Die gleiche Funktion kann wie folgt umgeschrieben werden:

%Vor%

Dies funktioniert genauso und ist dokumentiertes Verhalten; als diese Seite gibt klar an:

  

Der Ausdruck x and y bewertet zuerst x ; Wenn x falsch ist, wird der Wert zurückgegeben. Andernfalls wird y ausgewertet und der resultierende Wert zurückgegeben.

Da es sich jedoch um einen booleschen Operator handelt (im Handbuch wird das sogar gesagt), erwartete ich, dass and einen booleschen Wert zurückgibt. Infolgedessen war ich erstaunt , als ich herausfand (wie) das funktionierte.

Was sind andere Anwendungsfälle davon und / oder was ist der Grund für diese eher unintuitive Implementierung?

    
NullUserException 29.09.2010, 22:53
quelle

5 Antworten

5
  

Was sind andere Anwendungsfälle davon,

Prägnanz (und damit Klarheit, sobald man sich daran gewöhnt hat, denn immerhin nicht opfert die Lesbarkeit überhaupt! -) immer dann, wenn man etwas überprüfen muss und entweder dieses Etwas benutzt wenn es wahr ist, oder ein anderer Wert, wenn das etwas falsch ist (das ist für and - vertausche es für or - und ich bin sehr bewahre bewusst die eigentlichen Schlüsselwörter - oder die - wie True und False , da ich über jedes Objekt spreche, nicht nur bool ! -).

Der vertikale Platz auf jedem Computerbildschirm ist begrenzt, und wenn man die Wahl hat, ist es am sinnvollsten, nützliche Lesbarkeitshilfen (Docstrings, Kommentare, strategisch platzierte Leerzeilen zu separaten Blöcken, ...) zu verwenden, als beispielsweise eine Linie zu drehen wie:

%Vor%

in sechs wie:

%Vor%

oder verkrampfte Versionen davon.

  

und / oder was ist der Grund dafür?   eher nicht intuitive Implementierung?

Weit davon entfernt, "unintuitiv" zu sein, wurden Anfänger regelmäßig dadurch überrascht, dass einige Sprachen (wie Standard-Pascal) nicht die Reihenfolge der Auswertung und die Kurzschlussart von and angeben. und or ; Einer der Unterschiede zwischen Turbo Pascal und dem Sprachstandard, der Turbo damals zum beliebtesten Pascal-Dialekt aller Zeiten machte, war genau das Turbo, das and und or ähnlich wie Python später (und die C-Sprache) implementiert hat tat früher ...).

    
Alex Martelli 30.09.2010, 03:39
quelle
3
  

Was sind andere Anwendungsfälle davon,

Nein.

  

Was ist der Grund für diese eher nicht intuitive Umsetzung?

"nicht intuitiv"? "Ja wirklich?" Ich würde nicht zustimmen.

Lass uns nachdenken.

"a und b" ist gefälscht, wenn a falsch ist. Der erste falsche Wert ist also ausreichend, um die Antwort zu kennen. Warum sollte a in einen anderen booleschen Wert umgewandelt werden? Es ist schon falsch. Wie viel mehr falsch ist False ? Genauso falsch, oder?

Der Wert von a - wenn er mit False übereinstimmt - ist falsch genug, also der Wert des gesamten Ausdrucks. Keine weitere Umwandlung oder Verarbeitung. Erledigt.

Wenn der Wert von a äquivalent zu True ist, dann ist der Wert von b alles was benötigt wird. Keine weitere Umwandlung oder Verarbeitung. Warum transformiere b in einen anderen booleschen Wert? Sein Wert ist alles, was wir wissen müssen. Wenn es etwas wie True ist, dann ist es wahr genug. Wie viel wahr ist True ?

Warum gefälschte zusätzliche Objekte erstellen?

Gleiche Analyse für oder .

Warum zu boolesch transformieren? Es ist bereits wahr genug oder falsch genug. Wie viel wahrer kann es werden?

Probieren Sie das aus.

%Vor%

Während (True and 0) tatsächlich 0 ist, ist es gleich False . Das ist falsch genug für alle praktischen Zwecke.

Wenn es ein Problem ist, wird bool(a and b) die explizite Konvertierung erzwingen.

    
S.Lott 30.09.2010 00:10
quelle
0

Ich fand das nicht überraschend und erwartete sogar, dass es funktionierte, wenn ich es ursprünglich ausprobierte.

Obwohl nicht alle Werte bools sind, beachten Sie, dass alle Werte boolean sind - sie stellen einen Wahrheitswert dar. (In Python ist ein bool - tatsächlich - ein Wert, der nur für wahr oder falsch steht.) Die Zahl 0 ist kein Bool, aber explizit (in Python) hat einen booleschen Wert von False.

Mit anderen Worten, der boolesche Operator and gibt nicht immer bool zurück, aber immer gibt einen booleschen Wert zurück; eine, die wahr oder falsch repräsentiert, auch wenn sie auch logisch mit anderen Informationen verknüpft ist (zB eine Zeichenkette).

Vielleicht ist das eine rückwirkende Rechtfertigung; Ich bin mir nicht sicher, aber so oder so scheint es für Pythons Boolesche Operatoren natürlich zu sein, sich so zu verhalten wie sie.

Wann man es benutzt?

In Ihrem Beispiel fühlt sich test2 für mich klarer. Ich kann sagen, was beide gleich machen: Die Konstruktion in test2 macht es nicht schwerer zu verstehen. Alles andere gleich, der prägnantere Code in test2 wird - marginal - schneller verstanden. Das heißt, es ist ein trivialer Unterschied, und ich bevorzuge auch nicht genug, um alles neu zu schreiben.

Es kann auf andere Weise ähnlich nützlich sein:

%Vor%

Dies könnte anders umgeschrieben werden, aber das ist klar, einfach und prägnant.

Gehen Sie nicht über Bord; "a () und b () oder c ()" als Ersatz für "a ()? b (): c ()" ist gefährlich und verwirrend, da du mit c () enden wirst, wenn b () ist falsch. Wenn Sie eine ternäre Anweisung schreiben, verwenden Sie die ternäre Syntax, obwohl sie hässlich ist: b() if a() else c() .

    
Glenn Maynard 29.09.2010 23:47
quelle
0

Grundsätzlich gibt a and b den Operanden zurück, der den gleichen Wahrheitswert wie der gesamte Ausdruck hat.

Es mag etwas verwirrend klingen, aber tu es einfach in deinem Kopf: Wenn a False ist, dann spielt b keine Rolle mehr (weil False and anything immer False ist), also kann es gib sofort a zurück.

Aber wenn a True ist, dann ist nur b wichtig, also gibt es sofort b zurück, ohne auch nur nachzusehen.

Dies ist eine sehr häufige und sehr einfache Optimierung vieler Sprachen.

    
Jochen Ritzel 29.09.2010 23:56
quelle
0

Ich denke, während diese Notation "funktioniert", stellt sie einen schlechten Codierungsstil dar, der Logik verbirgt und erfahrenere Programmierer verwirrt, die das "Gepäck" des Wissens haben, wie die Mehrheit anderer Sprachen arbeitet.

In den meisten Sprachen wird der Rückgabewert einer aktiven Funktion durch die Art der Funktion bestimmt. Es sei denn, es wurde explizit überladen. Beispiel Es wird erwartet, dass eine 'strlen' -Funktion eine Ganzzahl und keine Zeichenfolge zurückgibt.

In-line-Funktionen wie die arthritischen und logischen Kernfunktionen (+ - / * | & amp;!) sind noch zurückhaltender, weil sie auch eine Geschichte der formalen Mathetheorie hinter sich haben. (Denken Sie an alle Argumente über die Reihenfolge der Operationen für diese Funktionen)

Damit fundamentale Funktionen alles zurückgeben, was nicht ihr am häufigsten verwendeter Datentyp ist (entweder logisch oder numerisch), sollten sie als zweckmäßige Verschleierung klassifiziert werden.

In fast jeder gängigen Sprache '& amp;' oder "& amp; & amp;" oder 'AND' ist eine logische oder boolesche Funktion. Hinter den Kulissen können Optimierungscompiler die Logik für kurze Schnitte wie oben in LOGIC FLOW verwenden, jedoch nicht für DATA STRUCTURE Modification (jeder optimierende Compiler, der den Wert auf diese Weise geändert hat, wäre als fehlerhaft betrachtet worden), aber wenn der Wert in einer Variablen verwendet wird für die weitere Verarbeitung sollte es in der logischen oder booleschen Art sein, weil das für diese Operatoren in den meisten Fällen "formal" ist.

    
Cosmo F 26.11.2014 17:30
quelle