@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