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]

Wie es funktioniert
- In Klammern wird ein Tupel aus zwei Elementen deklariert.
- In eckigen Klammern wird der Prädikatwert berechnet.
- 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 interessantHinweis
(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.