Seite 1 von 1

Frage zu verkürztem If (Ternäres If)

Verfasst: Freitag 25. Januar 2019, 13:59
von Jankie
Hallo,

ich wollte mal die verkürzte Schreibweise einer If-Anweisung testen und mir ist dabei ein "Fehler" aufgefallen.

Zu erst mal der Code den ich zum testen benutzt habe:

Code: Alles auswählen

def addiere(wert1,wert2):  
    ergebnis = wert1 + wert2
    return ergebnis


try:
    wert_1 = int(input("WERT1: ")) 
except:
    print("Kein Wert wurde angegeben. Es wird eine 0 eingesetzt.")
    wert_1 = 0

try:
    wert_2 = int(input("WERT2: "))
except:
    print("Kein Wert wurde angegeben. Es wird eine 0 eingesetzt.")
    wert_2 = 0


ergebnis_von_funktion = addiere(wert_1,wert_2)
    
ergebnis = ergebnis_von_funktion if (wert_1 != 0 and wert_2 != 0) else print("Null plus Null ist Null") #?
print(ergebnis) if (ergebnis != 0 and ergebnis != None) else print("Das Ergebnis ist Null")
In der Zeile mit dem Fragezeichen als Kommentar kommt meine Frage:

ich frage ja zwei Bedingungen ab. wert_1 soll ungleich 0 sein und wert_2 soll auch ungleich 0 sein. Wenn ich allerdings beim input bei nur einem der beiden Werte eine 0 eingeben, wird der else-Zweig in der verkürzten If-Anweisung ausgeführt. Daher meine Frage: Nimmt diese Form der If-Anweisung nur eine Bedingung auf oder habe ich einen Fehler im Code oder in meiner Denklogik? Und wird diese verkürzte Schreibweise eigentlich in der Praxis benutzt, da diese ja weniger übersichtlich ist?

MfG,

Jankie

Re: Frage zu verkürztem If (Ternäres If)

Verfasst: Freitag 25. Januar 2019, 14:40
von __blackjack__
@Jankie: Das ``if`` wird hier in einem Audruck verwendet, nicht in einer Anweisung. Ich mag über diese beiden Zeilen ehrlich gesagt gar nicht nachdenken, denn so benutzt man das sowieso nicht. Wenn da ein `print()` drin vorkommt, käme das bei mir nicht durch den Code-Review, und wenn das Ergebnis dieses Ausdrucks nicht verwendet wird schon mal gar nicht, auch ohne `print()` nicht. Das ist genauso wenig eine Kurzschreibweise um beliebige ``if``/``else``-Anweisungen auf eine Zeile zu quetschen wie „list comprehensions“ dazu da sind beliebige ``for``-Schleifen auf eine Zeile zu quetschen.

Edit: Ansonsten hat das doch gar nichts mit dem ``if``/``else``-Ausdruck zu tun sondern ist das ganz normale, erwartbare Verhalten bei der gegebenen Bedingung. Die sagt das *beide* Werte ungleich 0 sein müssen. Wenn einer das nicht ist, geht's ins ``else``.

Re: Frage zu verkürztem If (Ternäres If)

Verfasst: Freitag 25. Januar 2019, 14:46
von Jankie
Okay danke, hatte diese Möglichkeit nur irgendwo gesehen und wollte es mal ausprobieren. Mir persönlich gefällt die "normale" schreibweise sowieso besser, da einfach übersichtlicher.

Re: Frage zu verkürztem If (Ternäres If)

Verfasst: Freitag 25. Januar 2019, 15:55
von ThomasL
__blackjack__ hat geschrieben: Freitag 25. Januar 2019, 14:40 ..... ist das ganz normale, erwartbare Verhalten bei der gegebenen Bedingung. Die sagt das *beide* Werte ungleich 0 sein müssen. Wenn einer das nicht ist, geht's ins ``else``.
Es geht sogar sofort ins 'else' wenn die erste Bedingung nicht True liefert.

"if a and b and c and d" liefert sofort False wenn a==False, b, c und d werden nicht mehr geprüft

"if a or b or c or d" liefert sofort True wenn a==True, b, c und d werden nicht mehr geprüft

Dieses Verhalten kann man gezielt beim coden "ausnutzen", ob das "gut" ist, stelle ich mal zur Diskussion.

Re: Frage zu verkürztem If (Ternäres If)

Verfasst: Freitag 25. Januar 2019, 21:20
von Sirius3
@ThomasL: das ist gut, weil sonst könnte man nicht Dinge wie

Code: Alles auswählen

if obj is None or obj.is_empty():
oder

Code: Alles auswählen

if a > 0 and a**0.5 < 4:
nicht machen.