Seite 1 von 1

Equivalent zum Ternären Operator

Verfasst: Sonntag 11. Juli 2004, 21:15
von RainBowBender
Hallo,

es scheint einige Leute zu geben, die immer wieder den Ternären Operator von C zu vermissen scheinen und keinen 4 Zeiler wollen.

Code: Alles auswählen

if condition:
    a = trueresult
else:
    a = falseresult
Hier ist die Einzeilige Lösung:

Code: Alles auswählen

condition and trueresult or falseresult
Also z.B.

Code: Alles auswählen

3==3 and "richtig" or "falsch"
gibt "richtig" zurück

Code: Alles auswählen

3==4 and "richtig" or "falsch"
gibt "falsch" zurück

Zu beachten ist allerdings, dass hinter dem and oder dem or ein Ausdruck stehen muss, d.h. Funktionen müssen einen Rückgabewert haben.

Verfasst: Montag 12. Juli 2004, 07:37
von Milan
Hi. Nö, ist sie nicht. :wink: Denn wenn falseresult z.B. eine Leere Liste ist gilt diese auch als "falsch" und es wird dementsprechend 0 zurückgegeben. Besser ist es so, dass true- und falseresult immer wahr sind:

Code: Alles auswählen

f=lambda condition,trueresult,falseresult:(condition and [trueresult] or [falseresult])[0]
Es hat halt seine Tücken, dass auch andere Werte flasch sein können :wink:

Verfasst: Dienstag 13. Juli 2004, 17:40
von Beyond
Oder halt mein fertiges Module nehmen:
siehe Beitag "Module für ifthenelse und switch"
bzw. http://www.beyond-thoughts.com/tmp/switch.tar.gz

cu beyond

Verfasst: Samstag 25. September 2004, 11:46
von Dookie
Hi,

ich hatte gestern mal wieder eine Eingebung ;)

Code: Alles auswählen

a = 8
if a < 4:
    print "a ist kleiner 4"
else:
    print "a ist grösser oder gleich 4"
Kann man auch so erreichen:

Code: Alles auswählen

a = 8
print ("a ist grösser oder gleich 4", "a ist kleiner 4")[a < 4]
bei komplexeren Bedingungen, mit or und and, sollte man den Ausdruck in der eckigen Klammer mit bool(...) explizit in einen Booleanwert wandeln.
Das ganze basiert darauf, daß ein bool ja auch ein int ist mit dem wert 0 oder 1 für False und True. So kann man ihn auch als Index für ein Tuple oder eine Liste verwenden die zwei Einträge hat wobei der erste für False und der 2. für True steht.


Gruß

Dookie

Verfasst: Samstag 25. September 2004, 11:57
von Dookie
Mit der oben gezeigten Vorgehensweise, kann man auch Funktionen bedingt ausführen lassen:

Code: Alles auswählen

def func1(text):
    print "func1:", text

def func2(text):
    print "func2:", text

a = False
(func1, func2)[a]("Hallo a ist %s" % a)
a = True
(func1, func2)[a]("Halli a ist %s" % a)
ist a False, kann natürlich auch wieder ein Ausdruck sein, der ein Boolean zurückgibt, wird func1 ausgeführt, bei True func1.


Gruß

Dookie