Python: Doppeltes if-statement vereinfachen?

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Wenn a und b boolesche Werte sind, kannst Du in Python statt „a and not b“ auch „a>b“ schreiben.

Außerdem schließen sich die beiden Bedingungen gegenseitig aus. Das macht man normalerweise effizienter mit „elif“. Nur klappt das bei Dir wegen des „else“ so nicht, denn das greift ja immer, wenn die erste Bedingung erfüllt (und die zweite damit falsch) ist. Du könntest die Reihenfolge aber einfach umdrehen:

if a < b:
    fall_2()
else:
    if a>b:
        fall_1()
    fall_3()

Wenn ich Deinen Code lese, vermute ich sogar einen logischen Fehler: Willst Du den else-Teil (fall_3) womöglich nur dann ausführen, wenn beide Bedingungen falsch sind? Dann würde es reichen, Dein zweites if durch elif zu ersetzen. Leichter lesbar wäre es aber so:

if a == b:
    if a:
        print( "beide wahr" )
    else:
        print( "beide falsch" )
else: # a != b
    if a:
        print( "nur a" )
    else:
        print( "nur b" )
ItachiUchihaLX 
Fragesteller
 18.06.2022, 00:50

Ja ich denke mein Code in meiner Frage so macht wenig Sinn. Denn die beiden if's wären ja dann unabhängig zueinander und das Else bezieht sich dann nur auf das zweite if. Und um es nochmal zu verdeutlichen: Fall 1 ist nur a. Fall 2 ist nur b. Fall 3 ist wenn a und b gleich sind, also beide entweder True oder False sind. Das heißt ich könnte die Unterteilung wenn a == b, die Sie hier geschrieben haben, einfach weglassen.

Vielen Dank für die hilfreiche Antwort!

1
ralphdieter  18.06.2022, 12:33
@ItachiUchihaLX
einfach weglassen

Klar, wenn man es nicht braucht. Allerdings sieht man dann nicht mehr so leicht die vier Fälle, die sich gegenseitig ausschließen. Im Zweifelsfall würde ich kurz kommentieren, dass der erste Teil für beide Fälle (alles wahr/alles falsch) gilt.

Und pass bei a==b auf, falls das Funktionen aus Fremdbibliotheken sind. Die geben gelegentlich etwas anderes als bool zurück, und zwei Nonzero-Objekte müssen nicht unbedingt gleich sein. Schreib dann lieber

if bool(a)==bool(b):
1

An sich hast du mehrere Möglichkeiten:

  1. Wenn du niemals „a and b“ benutzt, dann kannst du auch schreiben:
if a or b:

else:

2. Ansonsten kannst du auch ein If sparen:

if (a and not b) or (b and not a):

else:
ItachiUchihaLX 
Fragesteller
 15.06.2022, 16:42

Bei a und b passieren jeweils verschiedene Sachen.

0

Man kann das zwar mit if/else anders hinschreiben, aber einfacher finde ich das nicht. Es sieht eher unübersichtlicher aus. Ich finde es gut, so wie das dasteht.

tunik123  15.06.2022, 16:44

Jetzt ist noch ein else dazugekommen. Spätesten jetzt würde ich empfehlen, das so stehenzulassen, wie es ist. Optimierungsversuche können es nur unübersichtlicher machen.

Ich kenne mich mit Python nicht aus. Gilt das else nur für das letzte if oder für beide (also wenn keiner der beiden if-Fälle zutrifft)? In C-ähnlichen Sprachen würde man bei if(b) ... dann else if schreiben. So etwas gibt es in Python doch sicher auch.

0

Der Else-Zweig wird auch ausgeführt, wenn die erste Bedingung

if (a) and (not b):

erfüllt ist. Ist der doppelte Auslöser so gewünscht?

Wenn nicht, dann:

if (b) and (not a):
  ...
else:
  if (a) and (not b):
    ...
  else:
    ...

Else denke ich mal

Woher ich das weiß:Hobby
ItachiUchihaLX 
Fragesteller
 15.06.2022, 16:32

Habe meine Frage ergänzt

0
ItachiUchihaLX 
Fragesteller
 15.06.2022, 16:35
@Criminechen

Das ist aber unvollstädnig. Denn wenn beides erfüllt ist, dann wird nur if a durchgeführt. Es soll aber else durchgeführt werden, wenn beides erfüllt wird.

0