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

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
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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``.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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.
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

__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.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten