Problem bei ersten Script

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.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 24. April 2009, 20:35

Man kann noch einiges kürzen und verschönern, aber dann hilft es wahrscheinlich nicht mehr ^^

Code: Alles auswählen

JA = "JA"
NEIN = "NEIN"
ENDE = "ENDE"
JA_NEIN = (JA, NEIN)

ausgaben = {(JA, NEIN) : "Wenn das so ist, geh am Besten im Park spazieren",
            (JA, JA) : "Wenn das so ist, geh am Besten im Park spazieren",
            (NEIN, NEIN) : "Wenn du schon alleine bist, solltest du ein Buch lesen.",
            (NEIN, JA) : "Na wie wäre es dann, wenn ihr beide jetzt ins Kino geht?"}

while true:
    print
    print "-"*63
    print "Abfrageprogramm zur Freizeitgestaltung der männlichen Schöpfung"
    print "-"*63
    print "Bitte nur mit %s oder %s antworten." % JA_NEIN
    print "(Andere Eingaben werden NICHT akzeptiert!)"
    print

    while true:
            print "Bitte nur mit %s oder %s antworten, Abfrage wird wiederholt." % JA_NEIN
            print "(Nur in Großbuchstaben %s oder %s eingeben!)" % JA_NEIN
            print
            print
            print
            
            wetter = raw_input ("Ist draußen denn gerade schönes Wetter? ").upper()
            freundin = raw_input ("Und hat deine Freundin momentan Zeit für dich? ").upper()

            eingabe = (wetter, freundin)
            if ausgabe.has_key(eingabe):
               print
               print ausgabe[(wetter, freundin)]
               print
               print
               print
               break

    whd = raw_input("Wiederholen? Zum Schließen %s eingeben: ").upper() % ENDE
    if whd == ENDE:
        break
Das Leben ist wie ein Tennisball.
zaine
User
Beiträge: 7
Registriert: Freitag 24. April 2009, 15:52

Freitag 24. April 2009, 20:44

So, hab von Bernhard schnell die Frage-Schleifen eingebaut:

Code: Alles auswählen

whd = ""
wetter = ""
freundin = ""
antworten = ["JA", "NEIN"]
while whd != "ENDE":
    print "\n---------------------------------------------------------------"
    print "Abfrageprogramm zur Freizeitgestaltung der männlichen Schöpfung"
    print "---------------------------------------------------------------"
    print "Bitte nur mit JA oder NEIN antworten."
    print "(Andere Eingaben werden NICHT akzeptiert!)\n"
    
    while wetter not in antworten:
        wetter = raw_input ("\nIst draussen denn gerade schönes Wetter? ")
        if wetter not in antworten:
            print "\n\nFalsche Eingabe. Bitte entweder mit JA oder NEIN antworten:"
    while freundin not in antworten:
        freundin = raw_input ("\n\nUnd hat deine Freundin momentan Zeit für dich? ")
        if freundin not in antworten:
            print "Falsche Eingabe. Bitte entweder mit JA oder NEIN antworten:"   
           
    if wetter == "JA" and freundin == "NEIN":
            print "\nDann solltest du zum heutigen Fußballspiel gehen.\n\n\n"
            whd = raw_input ("Wiederholen? Zum Beenden bitte ENDE eingeben: ")

    if wetter == "JA" and freundin == "JA":
            print "\nWenn das so ist, geh am Besten im Park spazieren\n\n\n"
            whd = raw_input ("Wiederholen? Zum Beenden bitte ENDE eingeben: ")

    if wetter == "NEIN" and freundin == "NEIN":
            print "\nWenn du schon alleine bist, solltest du ein Buch lesen.\n\n\n"
            whd = raw_input ("Wiederholen? Zum Beenden bitte ENDE eingeben: ")
             
    if wetter == "NEIN" and freundin == "JA":
            print "\nNa wie wäre es dann, wenn ihr beide jetzt ins Kino geht?\n\n\n"
            whd = raw_input ("Wiederholen? Zum Beenden bitte ENDE eingeben: ")
Damit bin jetzt fertig. Ich bedanke mich nochmal bei allen recht herzlich. Wenn ich wieder ein Problem haben sollte, lass ich es euch wissen :) .

@EyDu: Schöner Script, aber auch wieder etwas zu kompliziert. Bis ich dieses Verständnis habe dauert es vermutlich noch ein wenig.^^

P.S.: Berlin rulez =)
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Freitag 24. April 2009, 20:54

Hi zaine,

als nächstes solltest Du endlich die "männliche Schöpfung" weg machen. Die Geschöpfe können männlich sein. Die Schöpfung ist weiblich.
Ach ja, wenn Du den Code kurz haben willst, kannst Du immer noch die drei Zeilen sparen:
zaine hat geschrieben:

Code: Alles auswählen

whd = ""
antworten = ["JA", "NEIN"]
while whd != "ENDE":
    print ""
    print "---------------------------------------------------------------"
    print "Abfrageprogramm zur Freizeitgestaltung der männlichen Schöpfung"
    print "---------------------------------------------------------------"
    print "Bitte nur mit JA oder NEIN antworten."
    print "(Andere Eingaben werden NICHT akzeptiert!)\n"
    
    wetter = raw_input ("Ist draußen denn gerade schönes Wetter? ")
    freundin = raw_input ("Und hat deine Freundin momentan Zeit für dich? ")
    while wetter not in antworten and freundin  not in antworten: 
            print "Bitte nur mit JA oder NEIN antworten, Abfrage wird wiederholt."
            print "(\nNur in Großbuchstaben JA oder NEIN eingeben!)\n\n\n"
            wetter = raw_input ("Ist draußen denn gerade schönes Wetter? ") 
            freundin = raw_input ("Und hat deine Freundin momentan Zeit für dich? ")
    
    if wetter == "JA" and freundin == "NEIN":
            print "\nDann solltest du zum heutigen Fußballspiel gehen.\n\n\n"
            
    if wetter == "JA" and freundin == "JA":
            print "\nWenn das so ist, geh am Besten im Park spazieren\n\n\n"
         
    if wetter == "NEIN" and freundin == "NEIN":
            print "\nWenn du schon alleine bist, solltest du ein Buch lesen.\n\n\n"
                   
    if wetter == "NEIN" and freundin == "JA":
            print "\nNa wie wäre es dann, wenn ihr beide jetzt ins Kino geht?\n\n\n"

    whd = raw_input ("Wiederholen? Zum Beenden bitte ENDE eingeben: ")
Gruß,
Bernhard
zaine
User
Beiträge: 7
Registriert: Freitag 24. April 2009, 15:52

Freitag 24. April 2009, 20:56

Ah, danke. Kaum zu glauben das man hier auch noch andere Dinge lernt^^.

Gut, das mache ich, Geschöpfe in Zweibeiner geändert und die überflüssigen Zeilen gelöscht. Jetzt sollte der Script aber vollständig sein^^.



Jetzt muss ich es nur noch schaffen, mit py2exe daraus eine anwendung zu machen... :?
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Freitag 24. April 2009, 21:32

Code: Alles auswählen

    wetter = raw_input ("Ist draußen denn gerade schönes Wetter? ")
    freundin = raw_input ("Und hat deine Freundin momentan Zeit für dich? ")
    while wetter not in antworten or freundin  not in antworten:
        print "Bitte nur mit JA oder NEIN antworten, Abfrage wird wiederholt."
        print "(\nNur in Großbuchstaben JA oder NEIN eingeben!)\n\n\n"
        wetter = raw_input("Ist draußen denn gerade schönes Wetter? ")
        freundin = raw_input("Und hat deine Freundin momentan Zeit für dich? ")
(Man sollte übringens konsequent eine Einrückstiefe verfolgen und niemals tabs und leerzeichen vermischen)

Kann man besser durch eine Endlosschleife mit explizitem Abbruch (bzw einer "do-while" Schleife) darstellen:

Code: Alles auswählen

    while True:
        wetter = raw_input("Ist draußen denn gerade schönes Wetter? ")
        freundin = raw_input("Und hat deine Freundin momentan Zeit für dich? ")

        if wetter in antworten and freundin in antworten:
            break

        print "Bitte nur mit JA oder NEIN antworten, Abfrage wird wiederholt."
        print "(\nNur in Großbuchstaben JA oder NEIN eingeben!)\n\n\n"
Das Skript bricht ab, sobald wetter und freundin beide in antworten zu finden sind.

Desweitern ist die ursprüngliche Abfrage "wetter not in antworten and freundin not in antworten" falsch, da überprüft wird, ob sowohl wetter nicht in Antworten als auch freundin nicht in antworten ist. Ist eines falsch und das andere richtig, wird die Schleife trotzdem abgebrochen. Dementgegen steht die Überpfüfung in meinen Beispiel oben, wo ja explizit geprüft wird, ob beide Namen valid sind (und nicht, ob eine davon invalid ist).

Für "antworten" solltest du einen Tupel und keine Liste verwenden, da eine Liste semantisch auf eine andere Verwendung schließen lässt. Also '("JA", "NEIN")' schreiben. Tupel sind unveränderliche Listen, aber sie werden doch in anderen Zusammenhängen als Listen genutzt.

Zwischen Funktionsaufrufen und Klammern sollten keine Leerzeichen sein, siehe PEP8, den Python Styleguide.

@EyDu: Von der Verwendung von has_key wird abgeraten, ich meine es ist in 3.0 auch entfernt worden, stattdessen soll man "in" bzw __contains__ benutzen.
Antworten