if, elif...

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.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Hallo zusammen,

Code: Alles auswählen

umrechnungsfaktor = 13.76
betrag = input("Geben Sie einen Betrag ein: ")
antwort = input("Umrechnung Euro/Schilling(1) oder Schilling/Euro(2) ? ")

if antwort == 1:
    ergebnis = betrag * umrechnungsfaktor
    print "Der Schillingbetrag lautet: ", ergebnis
elif antwort == 2:
    ergebnis = betrag / umrechnungsfaktor
    print "Der Eurobetrag lautet: ", ergebnis
else:
    print antwort, "ist eine ungültige Eingabe!"
Statt dem elif wäre auch if möglich.
Was ist besser, oder ist es in dem Fall reine Geschmackssache?

(...und statt input...raw_input...das weiss ich, hatte meine Gründe das hier noch nicht zu tun.)

LG

rolgal_reloaded
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Wenn du so wie da arbeitest, und willst, das bei dem Vergleich ob

'' antwort == 1 '' oder '' antwort == 2 ''

eine Ausnahmefunktion ausgelöst wird, wenn beides nicht geht (der Vergleich), dann ist das die kürzeste Möglichkeit.


MfG EnTeQuAk
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Grundsätzlich wollte ich einfach ein sinnvolles Beispiel um if-elif-else zu erklären.

Wenn man mit sowas kommt im Unterricht:

Code: Alles auswählen

a=5
b=7

if a<b:
    print "irgendwas"
usw.

Dann darf man sich nicht wundern, wenn der Schüler fragt:
Wozu soll ich was vergleichen, was ich eh schon weiss :!:

Deshalb habe ich das mit der Benutzereingabe kombiniert.
Nur war ich mir nicht ganz sicher, ob es ganz pytonic ist, oder wie man zu sagen pflegt, wenn man hier elif verwendet, statt einem zweiten if

LG

rolgal_reloaded
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ich persoenlich finde es schoener, ein elif zu verwenden, wenn man es kann. Schliesslich wird ja immer nur einer der if-zweige ausgefuehrt, und das elif macht das auf den ersten Blick deutlich. Wie gesagt, meine Meinung.
rolgal_reloaded hat geschrieben:Dann darf man sich nicht wundern, wenn der Schüler fragt:
Wozu soll ich was vergleichen, was ich eh schon weiss Exclamation
*seufz* Das weiss ich aus leidvoller Erfahrung...
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Code: Alles auswählen

def buy_banana():
	 if not banana:
 		return #wenn es keine gibt, brauchen wir gar nicht weitergucken
 	elif banana.color == green:
 		return #wenn es welche gibt (s.o.), aber die noch grün sind, wollen wir auch keine
 	else:
 		banana.get() #ansonsten nehmen wir welche
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
BlackJack

Das hier ist irgendwie übersichtlicher:

Code: Alles auswählen

def buy_banana():
    if banana and banana.color != green:
        banana.get()
Es sollte schon ein Beispiel sein das man nicht so leicht vereinfachen kann.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Ich weiss jetzt nicht wirklich was ich von dem Bananabsp. für mein Beispiel ableiten soll. :shock: :?:

Erheitert(nicht negativ gemeint :!: ), hat es mich auf jeden Fall,
in diesem Sinne, vielen Dank, der heutige Tag ist nämlich eh schon hart genug.

rolgal_reloaded
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Kleiner Einwurf: Na ja, man kann aber als Lehrer auch ein allgemeines Problem liefern (z. B. den Bananenkauf oder etwas anderes) und dann alle verschiedenen Möglichkeiten (nur ifs, if kombiniert mit elif, usw.) durchgehen. Anhand dessen lassen Syntax und Semantik doch wunderbar erklären, inkl. der Unterschiede der verschiedenen Konstrukte.

Gruß,
Christian
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Code: Alles auswählen

>>> def buy_fruit(x):
... 	# Früchte sind global :-)
... 	if banana: # wenn es Bananen gibt,...
... 		fruit = banana.get(x) # ...nimm x Bananen
... 	elif apples: # wenn es keine Bananen gibt, aber Äpfel...
... 		if apples.price is low: # und die Äpfel nicht teuer sind...
... 			fruit = apples.get(x) # ... nimm x Äpfel
... 	else:
... 		raise PlanwirtschaftsError
... 	return fruit
Könnte auch eleganter sein, aber besser, oder? Vor allem kann man zeigen, dass im Gegensatz dazu im Folgenden immer Äpfel genommen werden, wenn es welche gibt und diese billig sind, selbst wenn es Bananen gegeben hätte und diese auch bereits genommen wurden. Außerdem kommt der PlanwirtschaftsError immer und nur dann, wenn es keine Äpfel gibt.

Code: Alles auswählen

>>> def buy_fruit(x):
... 	# Früchte sind global
... 	if banana: # wenn es Bananen gibt,...
... 		fruit = banana.get(x) # ...nimm x Bananen
... 	if apples: # wenn es Äpfel gibt...
... 		if apples.price is low: # und die Äpfel nicht teuer sind...
... 			fruit = apples.get(x) # ... nimm x Äpfel
... 	else:
... 		raise PlanwirtschaftsError
... 	return fruit
edit: Fehler im Kommentar beseitigt
Zuletzt geändert von N317V am Mittwoch 8. November 2006, 15:59, insgesamt 1-mal geändert.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

:D :D :D

:wink:
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

@N317V: Jepp, dein Beispiel verdeutlicht doch ziemlich gut was der unterscheid zwischen if und elif ist ;)

Erstes Beispiel:
Im ersten wird, wie du schon sagst wenn es Bananen gibt, die Bananen gekauft und dann die Funktion verlassen, _ohne_ zu überprüfen (wegen elif) ob es Äpfel gibt! Wenn es keine Bananen gibt, wird überprüft ob es den Äpfel gibt die günstig sind. Erst wenn keins von beiden zutrift wird ein exception ausgelöst. -> Logisch den die Planung ist fehlgeschlagen und es können kein Früchte mit nach (z.B.) Hause mitgebracht werden.

Aber nun der Logische Fehler den du gemacht hast:
  • Wenn es aber Äpfel gibt, aber die nicht günstig sind, wird die Funktion aber auch normal beendet anstatt eine exception auszulösen ;)
  • Aber wenn es keine Äpfel gibt wird ein Planwirschafts Fehler erzeugt. -> Sprich es können kein Äpfel nach hause mit gebracht werden -> Das widerspricht sich und ich sage auch gleich warum.
  • In dem Fall das die Äpfel zu Teuer sind sollte auch ein Planwirtschaftsfehler ausgelöst werde, da ja auch keine Äpfel mitgebracht werden können ^^ Verstehe einer worauf ich hinaus will? Es geht ja darum in deinem Beispiel das entweder Äpfel oder Bananen mitgebracht werden sollen, weil sonst die Wirtschaftsplanung fehlgeschlagen ist (Wird mir ja durch die Klasse PlanwirtschaftsError suggeriert ) und z.B. die Kinder dadurch zu Hause kein Obst kriegen. Oder sehe ich dass Falsch? Oder anders gesagt die Abfrage mit den Äpfeln widerspricht sich extrem.
Hier mein Ergänzung:

Code: Alles auswählen

def buy_fruit(x): 
    # Früchte sind global :-) 
     if banana: # wenn es Bananen gibt,... 
         fruit = banana.get(x) # ...nimm x Bananen
     elif apples: # wenn es keine Bananen gibt, aber Äpfel... 
         if apples.price is low: # und die Äpfel nicht teuer sind... 
             fruit = apples.get(x) # ... nimm x Äpfel
         else:
            raise PlanwirtschaftsError # Fehler kann keine Früchte mit nach hause bringen :(
     else: 
...      raise PlanwirtschaftsError # Fehler kann keine Früchte mit nach hause bringen :(
...  return fruit
Richtig wäre es ab er so bzw. kürzer:

Code: Alles auswählen

def buy_fruit(x): 
    # Früchte sind global :-) 
     if banana: # wenn es Bananen gibt,... 
         fruit = banana.get(x) # ...nimm x Bananen
     elif apples and apples.price is low: # wenn es keine Bananen gibt, aber Äpfel und die Äpfel nicht teuer sind...
         fruit = apples.get(x) # ... nimm x Äpfel
     else: 
...      raise PlanwirtschaftsError # Fehler kann keine Früchte mit nach hause bringen :(
...  return fruit

Zweites Beispiel:
Im zweiten Beispiel werden, wenn es Bananen gibt welche gekauft, und wenn es Äpfel gibt und die billig sind auch gekauft (wegen if). Aber wenn es Bananen gibt aber keine Äpfel folgt ein Exception -> Das heißt: Das impliziert, es müssen immer Äpfel vorhanden sein und ob Bananen da sind ist sekundär. Die werden einfach gekauft falls vorhanden. (Da mag wohl einer die Äpfel besonders gerne xD auch wenn sie günstig sein müssen wegen z.B. schlechter Session und den dadurch erhöhten Preis). Aber diese Beispiel hat immer noch den gleichen (bzw!. ähnlichen) logischen Fehler wie oben.

Hier schlägt die Planung fehl wenn es keine Äpfel gibt. Aber warum schlägt die Planung nicht fehl wen es zwar welche gibt, die aber zu teuer sind zum kaufen? Es könne dann auch keine Äpfel mitgebracht werden. Hmmm…

Hier mein Code:

Code: Alles auswählen

def buy_fruit(x):
     # Früchte sind global
     if banana: # wenn es Bananen gibt,...
         fruit = banana.get(x) # ...nimm x Bananen
     if apples and apples.price is low: # wenn es Äpfel gibt und die Äpfel 
         fruit = apples.get(x) # ... nimm x Äpfel
     else:
         raise PlanwirtschaftsError # Fehler kann keine Früchte mit nach hause bringen :(
     return fruit

Auf jeden fall eine sehr gutes Thema, weil man dadurch sehen kann wie wichtig es ist alle Möglichkeiten zu berücksichtigen, damit es keinen Widerspruch oder sonstige Fehler gibt, die gravierend sein könnten und einen nicht gewünschten Programmablauf zur folgen haben könnten.


In dem Beispiel ging es um eine Wirtschaftsplanung, die fehlschlägt wenn keine Früchte mitgebracht werden können. Nun könnte man z.B. implementieren wenn die Planung fehlschlägt und eine Exception ausgelöst wird, dass dann die Mutter oder der Vater in den nächsten Laden geht, um zu schauen ob es die gewünschten Früchte gibt (oder günstig gibt, wie im Fall der Äpfel) oder etwas andere Implementieren wie darauf reagiert wird. So weit so gut. Alles ist klar definiert damit der Programmablauf fehlerfrei Funktioniert.

Aber das Beispiel mit den Äpfeln zeigt uns, das dort ein Fehler gemacht wurde, der nicht mitberücksichtigt wurde. In der vorherigen Implementierung, würde die Mutter oder der Vater mit lehren Händen nach hause gehen, wenn die Äpfel zwar vorhanden sind aber nicht günstig. Auf das Programm bezogen, würde nun ein unvorhergesehener Fehler einträten und man müsste dann anfange zu debugen, weil man nicht weiß weshalb das Programm auf einmal abbricht oder einen Logischen fehler produziert, an einer stell wo das nicht auftreten dürfte.

lg xtra
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

XtraNine hat geschrieben:In dem Beispiel ging es um eine Wirtschaftsplanung, die fehlschlägt wenn keine Früchte mitgebracht werden können.
Sicherlich ist mein Beispiel nicht vollständig, aber da hast Du einen klassischen Verständnisfehler. Der PlanwirtschaftsError bedeutet: wenn es weder Bananen noch Äpfel gibt (nicht mal teure Äpfel), dann sind wir z.B. in der DDR, wo Planwirtschaft herrschte (im Gegensatz zu unserer Marktwirtschaft). Daraus folgt nicht, dass die Planung fehlt schlägt weil ich keine Früchte mitbringen kann; das ist in dem Moment zwar richtig, aber sekundär. Daraus folgt, viel wichtiger, dass ich schleunigst das Land verlassen muss. :-)

Trotzdem Danke für Deine Ergänzungen.

http://de.wikipedia.org/wiki/Planwirtschaft
http://de.wikipedia.org/wiki/Marktwirtschaft

Na gut, sollte wohl eher ZentralverwaltungswirtschaftsError heißen.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Oh, das wusste ich nicht das du das damit gemeint hast :-[ Ich dachte echt das es darum ging, ob Mutter oder Vater mit Fürchten nach hause kommt ^^
Da hab ich mal wider zu viel hineininterpretiert. ^^

Sry.

lg
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Ich will ja echt nicht darauf rumreiten, aber das ist so eine geile Steilvorlage für:
Tim Peters (The Zen of Python) hat geschrieben:In the face of ambiguity, refuse the temptation to guess.
Einfach weil das mein Lieblingsspruch in dem Text ist. :-) Nix für ungut!
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

N317V hat geschrieben:Ich will ja echt nicht darauf rumreiten, aber das ist so eine geile Steilvorlage für:
Tim Peters (The Zen of Python) hat geschrieben:In the face of ambiguity, refuse the temptation to guess.
Einfach weil das mein Lieblingsspruch in dem Text ist. :-) Nix für ungut!
Hmm, mein Englisch ist ziemlich schlecht.
Bedeutet das soviel wie: "Bei Mehrdeutigkeiten sollte man der Versuchung widerstehen zu raten."
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

@XtraNine: Klingt im Englischen etwas poetischer, ist aber inhaltlich korrekt wiedergegeben.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Eine "poetischere" Übertragung wäre vielleicht:

Stehst du vor Mehrdeutigkeit, bleib stark und rate nicht!

:D
BlackJack

Noch'n Versuch:

"Im Angesicht von Mehrdeutigkeit, widerstehe der Versuchung zu raten."
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

birkenfelds Ansatz klingt richtig schön heldenhaft. So richtig nach Manowar oder Conan oder so. ;-)

BlackJacks Übersetzung ist nahezu wortwörtlich. "verweigere Dich der Versuchung" wäre noch etwas genauer, klingt aber irgendwie holprig, oder?
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Gut, dann sind wir wohl fertig mit der Englisch Stunde (?) ;) In dem Sinne Back 2 Topic ;)

P.S: Ich sagte ja das ich kein englisch kann (bzw. sehr schlecht) :P

lg xtra

EDIT:
N317V hat geschrieben:[...]
BlackJacks Übersetzung ist nahezu wortwörtlich. "verweigere Dich der Versuchung" wäre noch etwas genauer, klingt aber irgendwie holprig, oder?
Ne finde ich nicht. Das kommt der Poesie am nähsten. ;) ^^

Aber nun wirklich b2t ^^
Antworten