Schreibweise a = b==2 and 5 or 10

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Serpens66
User
Beiträge: 259
Registriert: Montag 15. Dezember 2014, 00:31

Hallo :)

Anstatt:

Code: Alles auswählen

b = 2
if b==2:
    a = 5
else:
    b = 10
kann man ja in einer Zeile zb schreiben:

Code: Alles auswählen

b = 2
a = b==2 and 5 or 10
Nun wundere ich mich aber, warum bei der 5 ebenfalls auf True/False geprüft wird. Ich wollte nämlich machen:

Code: Alles auswählen

b = -2
a = b<0 and 0 or b
Damit also verhindern, dass es kleiner 0 wird. Doch da 0 unwahr ist, wird immer der b wert genommen.
Muss ich hier also die if/else Variante nehmen, oder mach ich bei dieser Kurzschreibweise was falsch?
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

Moin,

du möchtest

Code: Alles auswählen

a = 5 if b == 2 else 10
# und
a = 0 if b < 0 else b
schreiben. Im letzten Fall sogar eher

Code: Alles auswählen

a = max(0, b)
Warum der Hack mit `and` und `or` nicht geht:

Code: Alles auswählen

x and y or z
# wird ausgewertet als
(x and y) or z
Dabei ist `x and y` der Wert von `y`, wenn `x` truthy ist und sonst `x`. `w or z` ist der Wert von `w`, wenn `w` truthy ist und sonst `z`. Wenn jetzt sowohl `x` als auch `y` falsy ist, ist auch `x and y` falsy und `(x and y) or z` ist somit `z`.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

gem der PEP20 "Zen of Python" gilt: "readability counts". Von daher würde ich so oder so immer die 1. Version schreiben. Der Rest mag zwar Zeilen sparen, gut lesbar bzw. gut verständlich ist es IMHO aber nicht :-)

Gruß, noisefloor
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@Serpens66: zur Ergänzung, die and...or...-Schreibweise war modern, als es noch kein ...if...else gab. Erstere Form sollte man wegen schlechter Lesbarkeit und den unerwarteten Nebeneffekten mit Nullen nicht mehr benutzen, zweitere nur, wenn man wirklich ein Pattern hat, der sowohl im if- als auch im else-Zweig einer Variable einen kurzen Ausdruck zuweist, der nicht der Identität entspricht.
Antworten