Warum wird meine if schleife nicht ausgeführt?

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
pythonneuling84
User
Beiträge: 4
Registriert: Donnerstag 13. April 2023, 13:48

Hallo,

ich befasse mich erst seit 2 Tagen mit Python und habe ein Problem, was ich jetzt nicht gelöst bekomme. Und zwar wird meine If Schleife, wenn der Name "Juna" oder "Ava" ist, nur begrenzt ausgeführt. Das Programm springt von Zeile 7 immer direkt zu Zeile 32. Ich möchte aber, dass wenn die Bedingungen aus Zeile 8 (Beide Fragen mit "ja" beantwortet) der Codeteil danach ausgeführt wird.
Es soll eine andere Karte vorgeschlagen werden (die für Kinder, nicht die für Erwachsene).
Das ganze ist ein Beginner Projekt um die einfachen Basics zu lernen. Ich versuche die Probleme soweit ich es schaffe selbst zu lösen via google usw. hier komme ich jedoch nicht weiter.

Wo ist mein Fehler? Der Code spuckt selbst keinen Fehler aus.

Vielen Dank für eure Hilfe
Martin

Code: Alles auswählen

print("Willkommen in Willis Coffee Bar.\n")

name = input("Wie heißt du?\n")

if name == "juna" or name == "ava":
  saft = input("Für Kaffee bist du zu jung, " + name + ". Möchtest du etwas anderes?\n")
  geld = input("Hast du mehr als 2€ dabei?\n")
  if saft == "ja" and geld == "ja":
    menu2 = "Kakao 3€ oder Saft 2.5€"
    print("Was möchtest du trinken? Für Kinder haben wir heute im Angebot:\n" + menu2 + "\n")

  bestellung = input()
  print("\nGute Wahl, " + name + ".\n")
  
  preis = 4

  anzahl = input("Wie viel " + bestellung +" möchtest du?\n" )

  elif bestellung == "kakao":
   preis = 3
  elif bestellung == "saft":
    preis = 2.5
  else:
    print("Das haben wir hier leider nicht.\n")
  
  rechnung = preis * int(anzahl)

  print("Vielen Dank. Deine " + anzahl + " " + bestellung + " sind gleich bei dir. Das macht dann " + str(rechnung) + "€ bitte.")
  else:
    print("Dann musst du leider wieder gehen " + name + ".")
    exit ()
else:
  print("Hallo " + name + ", vielen Dank für deinen Besuch.\n")  
menu = "Kaffee (3€), Kakao (3€), Cappucino (4.5€), Frappucino (7€) und Saft (2.5€)"

print("Was möchtest du trinken? Wir haben heute im Angebot:\n" + menu + "\n")

bestellung = input()

print("\nGute Wahl, " + name + ".\n")

preis = 4

anzahl = input("Wie viele " + bestellung +" möchtest du?\n" )

if bestellung == "kaffee":
  preis = 3

elif bestellung == "kakao":
  preis = 3
elif bestellung == "cappucino":
  preis = 4.5

elif bestellung == "saft":
  preis = 2.5

elif bestellung == "frappucino":
  schaum = input("Möchtest du extra Milchschaum?\n")
  if schaum == "ja":
    ja_schaum = input("Das kostet 1€ extra. Ist das ok?\n")
    if ja_schaum == "ja":
      preis = 8
  else:
    print("Ok, dann ohne extra Milchschaum.\n")
    preis = 7
  
else:
  print("Das haben wir hier leider nicht.\n")
  
rechnung = preis * int(anzahl)

print("Vielen Dank. Deine " + anzahl + " " + bestellung + " sind gleich bei dir. Das macht dann " + str(rechnung) + "€ bitte.")
geraldfo
User
Beiträge: 44
Registriert: Samstag 28. Januar 2023, 20:19
Wohnort: Nähe Wien

Schleifen kannst du mit for oder while machen.
pythonneuling84
User
Beiträge: 4
Registriert: Donnerstag 13. April 2023, 13:48

Danke geraldfo

bei Schleifen im Sinne von "Schleifen" bin ich noch nicht. Nach meiner (vermutlich falschen) Logik müsste es doch auch so gehen.
Wenn x und y eintrifft, dann führe alles aus was ab jetzt im Code steht. Es ist ja auch eingerückt, sodass es als "Unterpunkt" zu "wenn x und y" steht. Ich hatte es so verstanden, dass bei if funktionen alles danach ausgeführt wird, bis etwas anderes der Fall ist. In meinem Fall wird direkt zu Beginn festgelegt, ob gleich zu Zeile 32 gesprungen wird, oder alles von 7 - 31 ausgeführt wird. So wollte ich es jedenfalls haben :/
einfachTobi
User
Beiträge: 492
Registriert: Mittwoch 13. November 2019, 08:38

Das Programm arbeitet da absolut korrekt. "Juna" != "juna". Es bietet sich also an immer nur die lowercase Strings zu vergleichen:

Code: Alles auswählen

name  = input("Name: ").lower()
if name in ("juna", "ava"):
    print("ok")
else:
    print("falscher Name")
Worauf geradlfo hinweisen will ist, dass if-Anweisungen keine Schleifen sind.
Benutzeravatar
grubenfox
User
Beiträge: 433
Registriert: Freitag 2. Dezember 2022, 15:49

Die Einrückungen sind kaputt. Der Code spuckt folgenden Fehler aus:

Code: Alles auswählen

  File "machwas2.py", line 28
    elif bestellung == "kakao":
       ^
SyntaxError: invalid syntax
geraldfo
User
Beiträge: 44
Registriert: Samstag 28. Januar 2023, 20:19
Wohnort: Nähe Wien

Mach die Einrückungen einheitlich mit 4 Spaces. Und ohne Tab-Zeichen.

LG Gerald
pythonneuling84
User
Beiträge: 4
Registriert: Donnerstag 13. April 2023, 13:48

einfachTobi hat geschrieben: Donnerstag 13. April 2023, 14:25 Das Programm arbeitet da absolut korrekt. "Juna" != "juna". Es bietet sich also an immer nur die lowercase Strings zu vergleichen:

Code: Alles auswählen

name  = input("Name: ").lower()
if name in ("juna", "ava"):
    print("ok")
else:
    print("falscher Name")
Worauf geradlfo hinweisen will ist, dass if-Anweisungen keine Schleifen sind.
Das habe ich hier nur falsch geschrieben. in der Konsole gebe ich "juna" ein und es funktioniert trotzdem nicht.

"Schleife" ist vermutlich auch das falsche Wort, was ich hier gewählt habe. Ich bitte um Entschuldigung. Ich wollte eine "Abzweigung" einbauen. Der Name der Person soll über den "Weg" entscheiden. Weg A "kinderkarte" (Code Zeile 7-31) Weg B "Erwachsenenkarte" (Code Zeile 32 - Ende)

Das mit der Einrückung werde ich mal kontrollieren. Ich nutze bisher eine webbasierte Konsole (weiß nicht ob die Werbung erlaubt ist, daher nenne ich den Namen nicht), da ich auf dem Ipad angefangen habe. Mittlerweile nutze ich aber einen Windowslaptop und kann mir da was gescheiteres zulegen/ installieren.
geraldfo
User
Beiträge: 44
Registriert: Samstag 28. Januar 2023, 20:19
Wohnort: Nähe Wien

Das mit der Einrückung werde ich mal kontrollieren.
Korrekte Einrückungen sind in Python essentiell.
Sirius3
User
Beiträge: 17762
Registriert: Sonntag 21. Oktober 2012, 17:20

Einrückungen sind wirklich wichtig. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 2 und mal 3.
Strings stückelt man nicht mit + zusammen, sondern man benutzt Formatstrings.
Variablennamen sollten sprechend sein. Was soll die 2 an `menu2`? Und warum ist das überhaupt ein separater String. Am besten ein print pro Zeile.
Man definiert nicht einfach so Variablen mit Dummywerten. Warum wird `preis` auf 4 gesetzt, was aber gar nicht weiter verwendet wird? Das birgt nur die Gefahr, dass es tatsächlich einen Weg im Programm gibt, bei dem die 4 durchrutscht, statt dass eine Fehler geworfen wird, weil `preis` nicht definiert ist.
Es ist komisch, dass ich nach der Anzahl an Heizlüftern gefragt werde, obwohl gar keine Heizlüfter auf der Karte stehen. Die Anzahl sollte doch nach der Prüfung der Bestellung stattfinden.
Das ist ein `elif` das eigentlich ein if sein sollte!
Wenn es kein Kakao oder Saft ist, werden trotzdem meine Heizlüfter für 4€ das Stück geliefert, auch wenn Du behauptest, dass es die gar nicht gibt.
Du mußt also in diesem Fall abbrechen, am besten, indem Du alles in eine Funktion schreibst, die man einfach per `return` verlassen kann.
`exit` darf in einem sauberen Programm nicht vorkommen (außer man ist im Hauptprogramm und gibt tatsächlich etwas anderes als 0 als Exitcode zurück).
Und dann hast Du den selben Code nochmal, Codewiederholungen versucht man aber zu vermeiden, indem man passende Funktionen oder Datenstrukturen verwendet.
Und noch eine Sicherheitslücke: wenn ich den Frappuciono mit Extraschaum bestelle, mich dann aber doch dagegen entscheide, dann kostet der nur 4€. Hatte ich schon geschrieben, dass man niemals Variablen mit Dummy-Werten belegt??
Durch etwas Code-Umstellung kann man wenigstens einen Teil des doppelten Codes relativ einfach nach den if-else-Blöcken schreiben.
Wir kommen dann ungefähr zu soetwas:

Code: Alles auswählen

def main():
    print("Willkommen in Willis Coffee Bar.\n")

    name = input("Wie heißt du?\n")

    if name == "juna" or name == "ava":
        saft = input(f"Für Kaffee bist du zu jung, {name}. Möchtest du etwas anderes?\n")
        geld = input("Hast du mehr als 2€ dabei?\n")
        if saft != "ja" or geld != "ja":
            print(f"Dann musst du leider wieder gehen {name}.")
            return

        print("Was möchtest du trinken? Für Kinder haben wir heute im Angebot:")
        print("Kakao 3€ oder Saft 2.5€")
        bestellung = input()
        print(f"\nGute Wahl, {name}.\n")
    
        if bestellung == "kakao":
            preis = 3
        elif bestellung == "saft":
            preis = 2.5
        else:
            print("Das haben wir hier leider nicht.\n")
            return
    else:
        print(f"Hallo {name}, vielen Dank für deinen Besuch.\n")
        print("Was möchtest du trinken? Wir haben heute im Angebot:")
        print("Kaffee (3€), Kakao (3€), Cappucino (4.5€), Frappucino (7€) und Saft (2.5€)")

        bestellung = input()
        print(f"\nGute Wahl, {name}.\n")

        if bestellung == "kaffee":
            preis = 3
        elif bestellung == "kakao":
            preis = 3
        elif bestellung == "cappucino":
            preis = 4.5
        elif bestellung == "saft":
            preis = 2.5
        elif bestellung == "frappucino":
            schaum = input("Möchtest du extra Milchschaum?\n")
            if schaum == "ja":
                ja_schaum = input("Das kostet 1€ extra. Ist das ok?\n")
                if ja_schaum == "ja":
                    preis = 8
                else:
                    print("Ok, dann ohne extra Milchschaum.\n")
                    preis = 7
            else:
                preis = 7
        else:
            print("Das haben wir hier leider nicht.\n")
            return
    
    anzahl = input(f"Wie viel {bestellung} möchtest du?\n")
    rechnung = preis * int(anzahl)
    print(f"Vielen Dank. Deine {anzahl} {bestellung} sind gleich bei dir. Das macht dann {rechnung}€ bitte.")

if __name__ == "__main__":
    main()
pythonneuling84
User
Beiträge: 4
Registriert: Donnerstag 13. April 2023, 13:48

@Sirius3
vielen Dank für deine ausführliche Antwort. Deine Version werde ich mir gleich mal ausführlich anschauen.

Der "Grund-Code" ist aus einem Tutorial von Yourtube, von einem Coding Youtuber aus seiner Python Basic Reihe. Daher habe ich sowohl die Web-Umgebung in der ich das geschrieben habe (die 0 Fehler ausgibt mit meinem Code), sowie die Art und Weise wie ich es gecodet habe.

Die Einrückungen werden dort immer mit tabs erklärt.
Die "dummy-werte" habe ich so benannt, wie ich sie mir leicht merken und kurz halten konnte. menu2 wurde nachträglich eingefügt (da es zuerst nur die Option ohne Namen ausschließen gab). Ich hätte es auch "Kinderkarte" o.ä. nennen können aber menu2 war kürzer. Menu wurde aus dem englischen Tutorial übernommen. Genau wie Preis = 4. Zuerst kosteten alle Getränke das gleiche. Nachträglich war es dann die Aufgabe, jedem Getränk einen anderen Wert zuzuordnen. Genau wie die Elif Werte. Zuerst war alles "if bestellung == "kakao": preis = 4" usw. Dann wurde erklärt, dass man die if in elifs umbauen kann (den Unterschied bzw. nutzen habe ich noch nicht ganz verstanden).

Vielleicht sind die Tutorials "falsch" im Sinne von "nicht ganz sauber gecodet" und/oder ich habe das ein oder andere falsch verstanden/ umgesetzt.
Ich besitze noch ein E-Book zum Thema Python. Das werde ich mir mal anschauen, so wie ein anderes Youtube Video zum Thema Coding.
geraldfo
User
Beiträge: 44
Registriert: Samstag 28. Januar 2023, 20:19
Wohnort: Nähe Wien

PEP 8 – Style Guide for Python Code
https://peps.python.org/pep-0008/
Use 4 spaces per indentation level.
Ich vermute, dass dieser Style-Guide von den meisten Python-Entwicklern als relevant eingestuft wird.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

geraldfo hat geschrieben: Donnerstag 13. April 2023, 15:58 PEP 8 ... Ich vermute, dass dieser Style-Guide von den meisten Python-Entwicklern als relevant eingestuft wird.
Dem ist so.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

@pythonneuling84:
Der Unterschied zwischen "if" und "elif" ist wichtig. Das solltest du nochmal ausprobieren.
Es gibt ein offizielles Python Tutorial, das ist sehr zu empfehlen, allerdings auf Englisch.
Es kann gut sein, dass Youtuber X oder Ebook Y in der Qualität nicht ganz mithalten.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten