Seite 1 von 1

Schreibweise a = b==2 and 5 or 10

Verfasst: Sonntag 5. November 2017, 23:57
von Serpens66
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?

Re: Schreibweise a = b==2 and 5 or 10

Verfasst: Montag 6. November 2017, 00:07
von narpfel
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`.

Re: Schreibweise a = b==2 and 5 or 10

Verfasst: Montag 6. November 2017, 07:35
von noisefloor
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

Re: Schreibweise a = b==2 and 5 or 10

Verfasst: Montag 6. November 2017, 07:46
von Sirius3
@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.