Eine alternative Form des ternären Python-Operators

Ich habe kürzlich eine Alternative zur Standardkonstruktion von " expression_on_true if predicate else expression_on_false " entdeckt, die ich in Verzeichnissen nicht gesehen habe:

(expression_on_false, expression_on_true)[predicate]

Bild

Wie es funktioniert


  1. In Klammern wird ein Tupel aus zwei Elementen deklariert.
  2. In eckigen Klammern wird der Prädikatwert berechnet.
  3. Auf ein Tupel wird am Index 1 (wenn der Wert des Prädikats True ist) oder 0 (wenn der Wert des Prädikats False ist) zugegriffen.

Schauen wir uns ein Beispiel an


Angenommen, wir haben ein , und wir müssen "positiv" drucken, wenn die Zahl nicht kleiner als Null ist, oder "nagativ", wenn die Zahl kleiner als Null ist.


>>> a = 101
>>> ("negative", "positive")[a >= 0]
'positive'
>>> a = -42
>>> ("negative", "positive")[a >= 0]
'negative'
>>> a = 0
>>> ("negative", "positive")[a >= 0]
'positive'

Im ersten Fall ist 101> = 0, sodass das Prädikat True zurückgibt. Bei der Indizierung wird True zu 1, sodass der Aufruf an das Element mit Index 1 geht. Im zweiten Fall dasselbe: Das Prädikat ist False, der Aufruf geht an das Element mit Index 0.

Konstruktion ("negativ", "positiv") mindestens [a> = 0] und nicht viel kürzer als "positiv", wenn a> = 0, sonst "positiv" , aber ich finde diese Funktion trotzdem interessant

Hinweis


(danke an Dasdy )
Wenn wir anstelle von Konstanten Ausdrücke in das Tupel einsetzen, von denen nur einer ausgeführt werden soll, verliert diese Konstruktion ihre Bedeutung.

All Articles