Anfänger: Programm beenden

Code-Stücke können hier veröffentlicht werden.
Antworten
Nacer5
User
Beiträge: 4
Registriert: Sonntag 20. Dezember 2020, 11:46

Hallo liebe Community,

ich bin vor 2 Monaten mit dem Python Programmieren angefangen und hänge jetzt fest. Ich möchte eine Bot Unterhaltung erstellen, bei der der Code beendet wird wenn der User z.B. Nein eingibt. Ich hab es mit "quit" gemacht, funktioniert aber scheint nicht optimal. Dann hab ich eine While Schleife gebastelt, aber auch hier läuft das Programm weiter.

Ich hab meinen Code mal bei GitHub hochgeladen (unter Nacer5). Bin allerdings auch GitHub Neuling. :-)

Dann mein zweites Problem: Eigentlich wollte ich das der User Fragen beantwortet und diese Antworten (mehrere) mit mehreren Listen abgeglichen werden. Die Liste mit den meisten Übereinstimmungen sollte dann dem User als Lösung vorgeschlagen werden. Habe versucht die Lösungen zu speichern, aber wie mache ich den Abgleich.

Ich würde mich wahnsinnig über Rückmeldung freuen! Mit meinem Gebastel komm ich nicht weiter.

Hier ein Auszug aus meinem Code. Ich

Code: Alles auswählen

import random
from time import sleep
#Bibliothek

schulterstand =  ("bauch", "innerer_koerper", "oberer_koerper", "ruecken")
fisch =     ("ruecken", "brustkorb")
vorwaertsbeuge = ("innerer_koerper", "ruecken")

asanas = [schulterstand, fisch, vorwaertsbeuge]
#Vorstellung
print("Hallo, ich bin YoBo dein persönlicher Yoga Assistent.")
sleep(1)
print("Wie heißt du? ")
user_name = input()
print("Hi " + user_name + ".")
sleep(1)
kennen_lernen = ["Freut mich dich kennen zu lernen!", ":-)", "Schön dich kennen zu lernen! :-)"]
print(random.choice(kennen_lernen))
sleep(1)

weitermachen = True
while weitermachen == True:
    antwort_gefuehl= input("gehts gut ja/nein?")
    if "ja" in antwort_gefuehl:
        print("supi")
        weitermachen = True
    else:
        print("schade")
        weitermachen = False
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Nacer5: Ich kann Da kein Problem sehen. Wenn ich nicht "ja" eingebe, dann endet das Programm weil die ``while``-Schleife verlassen wird.

Anmerkungen zum Quelltext:

`asanas` wird nirgens verwendet und damit auch `schulterstand`, `fisch`, und `vorwaertsbeuge` nicht. Letztere sollten wahrscheinlich keine Tupel sein sondern mindestens mal Listen, aber sehr wahrscheinlich ist das insgesamt die falsche Datenstruktur vermute ich mal. Das wird am Ende wohl eher eine Liste mit Tupeln aus Übungsname und einer Menge (`set`) von betroffenen Körperregionen sein, oder ein Wörterbuch das Übungsnamen auf besagte Mengen abbildet.

Beim ersten `input()` könntest Du das `print()` direkt davor einsparen in dem Du `input()` den Text übergibst.

Zeichenketten und Werte mit ``+`` zusammenstückeln ist eher BASIC denn Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode und f-Zeichenkettenliterale.

`kennen_lernen` ist ein komischer Name. Erst einmal würde man das zusammenschreiben: `kennenlernen`, und dann ist das aber auch inhaltlich komisch. Namen sollen dem Leser vermitteln was der Wert dahinter bedeutet. `kennenlernen` ist eine Tätigkeit oder ein Vorgang. Der Wert ist aber eine Sequenz von Texten. `begruessungs_texte` würde dem Leser das mitteilen.

Man macht keine Vergleiche mit literalen Wahrheitswerten. Bei dem Vergleich kommt doch nur wieder ein Wahrheitswert bei heraus. Entweder der, den man sowieso schon hatte; dann kann man den auch gleich nehmen. Oder das Gegenteil davon; dafür gibt es ``not``.

Letztlich braucht man dieses Flag hier aber auch gar nicht, weil man auch eine ”Endlosschleife” schreiben kann, die man an der entsprechenden Stelle mit ``break`` verlässt.

``in`` ist der falsche Vergleichsoperator. Der Benutzer kann da auch "Babajaga" eingeben und das wird als "ja" interpretiert weil da ein "ja" drin enthalten ist. Wohl eher nicht so das was man erwarten würde.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import random


def main():
    print("Hallo, ich bin YoBo dein persönlicher Yoga Assistent.")
    user_name = input("Wie heißt du?\n")
    print(f"Hi {user_name}.")
    print(
        random.choice(
            [
                ":-)",
                "Freut mich dich kennen zu lernen!",
                "Schön dich kennen zu lernen! :-)",
            ]
        )
    )
    while True:
        if input("Gehts gut ja/nein? ").strip().lower() == "ja":
            print("supi")
        else:
            print("schade")
            break


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Nacer5
User
Beiträge: 4
Registriert: Sonntag 20. Dezember 2020, 11:46

Vielen Dank für deine Antwort. Ich kopier hier mal den kompletten Code rein. Er läuft leider auf Fehler. Ich glaube das auch die Einrückungen nicht korrekt sind. Leider komme ich nicht weiter. Habe schon verschiedenes versucht. Ich seh den Wald vor lauter Bäumen nicht mehr. :lol:

Code: Alles auswählen

import random
from time import sleep
#Bibliothek
schulterstand = ("bauch", "innerer_koerper", "oberer_koerper", "ruecken")
fisch = ("ruecken", "brustkorb")
vorwaertsbeuge = ("innerer_koerper", "ruecken")
asanas = [schulterstand, fisch, vorwaertsbeuge]

#Vorstellung
print("Hallo, ich bin YoBo dein persönlicher Yoga Assistent.")
sleep(1)
user_name = input("Wie heißt du?\n")
print(f"Hallo {unser_name}.")
sleep(1)
kennen_lernen = ["Freut mich dich kennen zu lernen!", ":-)", "Schön dich kennen zu lernen! :-)"]
print(random.choice(kennen_lernen))
sleep(1)
#Frage Wohlbefinden

weitermachen = True
while weitermachen == True:
    liste_wohlbefinden = ["gut", "super","klasse", "großartig", "fantastisch"]
    liste_fragen = ["Wie geht es dir?\n", "Wie gehts? gut/schlecht\n", "Geht es dir gut? ja/nein\n"]
    liste_antworten = ["Klasse, das freut mich!", "Super!", "Sehr gut"]
    auswahl_fragen = (random.choice(fragen))
    antwort_fragen = input(auswahl_fragen)
    antwort_fragen.lower()

weitermachen = True
if happy == True:
    if "nicht" in antwort_fragen:
        antwort_nicht_in_gefuehl = print("Ok, willst du trotzdem weiter machen? ja/nein\n")
        if "nein" in antwort_nicht_in_gefuehl:
            print("Ok, dann vielleicht ein anderes mal.")
            weitermachen = False
        else:
            print("Super, weiter gehts.")
    elif "ja" in antwort_fragen or "gut" in antwort_fragen or wohlbefinden in antwort_fragen:
        print(random.choice(liste_antworten) 
    else:
    frage_weitermachen = input("Ok, willst du trotzdem weiter machen? ja/nein\n")
    if "nein" in frage_weitermachen:
        print("Ok, schade.")
        weitermachen = False
    else:
        print("Weiter gehts.")
        weitermachen = True

#Frage ob ein Vorschlag gemacht werdern soll.
    sleep(1)   
    print("Möchtes du das ich für dich eine passende Yoga Übung heraussuche?")
    sleep(2)
    print("Dafür würde ich dir ein paar Fragen stellen.")
    sleep(2)
    antwort = input("Ok? (ja/nein)\n")

    if "nein" in antwort:
        print("Schade, vielleicht ein anderes mal.")
        sleep(1)
        weitermachen = False
        #Hier soll das Programm dann enden.
    else:
        print("Ok super, dann beginne ich mit der ersten Frage.")
        sleep(2)

#Anamnese Rücken
    frage_ruecken = input("Möchtest du etwas für deinen Rücken tun? ja/nein\n")
    frage_ruecken = frage_ruecken.lower()
    antwort_ruecken = ()
    if "ja" in frage_ruecken:
        antwort_ruecken = ("ruecken")
        print("Ok, Rücken")
    else:
        print("Gut.")
        sleep(1)

#Anamnese Bauch
    frage_bauch = input("Möchtest du was für deinen Bauch tun? ja/nein\n")
    frage_bauch = frage_bauch.lower()
    antwort_bauch = ()
    if "ja" in frage_bauch:
        antwort_bauch = ("bauch")
        print("ok")
    else:
        print("Gut, kein Bauch")
        sleep(1)
#Anamnese innerer Körper
    frage_innerer_koerper = input("Wie wäre es deinen Stoffwechsel und deine Verdauung in Gang zu bringen. Möchtest du es in deine Übung mit einbauen? ja/nein?n")
    frage_innerer_koerper = frage_innerer_koerper.lower()
    antwort_innerer_koerper =()
    if "ja" in frage_innerer_koerper:
        antwort_innerer_koerper = innerer_koerper
        speed(5)
        print("Das ist super, dein Körper wird es dir danken. :-)")
    else:
        print("Ok, dann lassen wir es weg.")
#Auswertung
    if antwort_bauch in schulterstand and antwort_ruecken in schulterstand:
        print("Dann ist der Schulterstand genau das Richtige. Viel Spaß!")
    elif antwort_ruecken in fisch:
        print("Dann empfehle ich dir den Fisch. Danke fürs mitmachen und viel Spaß.")
    elif antwort_innerer_koerper in vorwaertsbeuge and antwort_bauch in vorwaertsbeuge:
        print("Dann empfehle ich dir die Vorwärtsbeuge.")
    else:
        print("Sorry, leider habe ich keinen Vorschlag für dich.")
        weitermachen = False
    else:
        schlechtes_gefuehl = input("Oh, das klingt nicht gut. Wollen wir ein anderes mal weiter machen? (ja/nein)")
        schlechtes_gefuehl.lower()
        if "nein" in schlechtes_gefuehl:
        print("Super, weiter gehts!")
        weitermachen = True
        else:
        print("Schade, dann vielleicht ein anderes mal.")
        weitermachen = False

print (f"Ok, {user_name}. Hab noch einen schönen Tag!")
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Nacer5: Ja da sind ganz offensichtlich mehrere Einrückfehler drin. Es sollte gar nicht erst so viel Code mit so vielen Fehlern geben. Man schreibt keine 100+ Zeilen ohne so etwas zu bemerken. Man schreibt ein Programm nicht erst komplett runter bevor man es mal testet, sondern entwickelt das Schritt für Schrittt und testet immer was man bis dahin hat.

Da fällt dann übrigens schnell auf das man an Testläufen immer weniger Lust hat wegen der ganzen unsinnigen `sleep()`-Aufrufe die das ganze unnötig zäh und langsam machen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Nacer5
User
Beiträge: 4
Registriert: Sonntag 20. Dezember 2020, 11:46

Das Problem bei dem Code ist, das ich ihn nachträglich geändert hab und dann kamen die Fehler. :? Ich habe ihn nicht komplett neu geschrieben.

Die Frage nach dem Usernamen hast du über eine Definiton gelöst. Kannst du mir sagen was der Vorteil zu dem von mir erstellten Code ist? Das habe ich noch nicht verstanden.

Hast du noch einen Tipp wie ich folgendes hinbekomme:
Ich frage ja nach Antworten, diese Antworten sollen zusammen mit den vorhandenen Listen verglichen werden um dann die Liste mit den meisten Übereinstimmungen zu finden. Ich hab es jetzt anders gelöst, finde es aber nicht besonders schön.

Mit den Einrückungen muss ich nochmal gucken. Ich hab es schon mehrfach geändert, aber immer wieder kommt ein anderer Fehler. :roll:
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Nacer5: Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst, und die von dem ``if __name__ …`` nur aufgerufen wird wenn man das Modul als Programm ausführt. Dadurch kann man das Modul importieren ohne dass das Hauptprogramm ausgeführt wird. Das ist praktischer zu Fehlersuche und auch ein paar Werkzeuge und Bibliotheken erwarten das man Module importieren kann ohne das mehr passiert als das Konstanten, Funktionen, und Klassen definiert werden. Und man hat dann auch gar nicht erst irgendwelche Probleme mit Variablen auf Modulebene.

Du machst Da zu viel in statischem Code was eigentlich über Datenstrukturen passieren sollte. Die Listen sollten nicht an Namen gebunden werden, die dann im Code fest referenziert werden, sondern in einer passenden Datenstruktur stecken über die man dann mit einer Schleife iterieren kann um die Liste mit den meisten Übereinstimmungen zu finden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten