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.
Antworten
zaine
User
Beiträge: 7
Registriert: Freitag 24. April 2009, 15:52

Hallo ihr :).

In Informatik arbeiten wir mit Python jetzt das erste mal und sollen ein kleines Programm schreiben. Aufgabe:

Es sollen 2 Fragen nacheinander gestellt werden, die mit JA oder NEIN beantwortet werden. Dementsprechend soll dann eine Antwort ausgegeben werden.

Das fand ich aber etwas primitiv und habe deshalb den Script so erweitert, das immer, wenn etwas anderes als JA oder NEIN eingegeben wird, dies auch gemeldet wird und die Fragen wiederholt werden.

Sind die Eingaben korrekt, soll die entsprechende Antwort erscheinen und danach soll angeboten werden, den Script zu wiederholen, um die Antworten schneller durchzutesten.

So, Problem ist jetzt nur, das der Script nicht vollständig funktionert. Manchmal funktionieren die Bedingungen, manchmal nicht. Da ich noch nicht viel Ahnung vom programmieren habe (und auch im Tutorial auf die Schnelle nichts gescheites dazu gefunden habe), wäre es nett, wenn jemand den Code korrigieren würde und mir erklärt, was ich falsch gemacht habe.

Hier der Code:

Code: Alles auswählen

whd = ""
while whd != "NEIN":
 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!)")
 print ("")
 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 or freundin != "JA" or "NEIN":
   print "Bitte nur mit JA oder NEIN antworten, Abfrage wird wiederholt."
   print "(Nur in Großbuchstaben JA oder NEIN eingeben!)"
   print ""
   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 "Dann geh jetzt zum Fußballspiel."
    whd = raw_input ("Wiederholen? (JA/NEIN): ")
    break
    
   if wetter == "JA" and freundin == "JA":
    print "Am Besten gehst du spazieren."
    whd = raw_input ("Wiederholen? (JA/NEIN): ")
    break
    
   if wetter == "NEIN" and freundin == "NEIN":
    print "Wenn du schon alleine bist, solltest du ein Buch lesen."
    whd = raw_input ("Wiederholen? (JA/NEIN): ")
    break
    
   if wetter == "NEIN" and freundin == "JA":
    print "Dann ab mit dir in das Kino!"
    whd = raw_input ("Wiederholen? (JA/NEIN): ")
    break
problembär

Code: Alles auswählen

while wetter or freundin != "JA" or "NEIN":
:lol: Diese Zeile prüft:

1. Ist wetter wahr, das heißt nicht "", False oder 0 usw..
oder
2. ist freundin ungleich "JA"
oder
3. ist "NEIN" wahr (also immer, da "NEIN" nicht "", False oder 0 usw. ist).

Nicht ganz, was Du gewollt hattest ...

Gruß

P.S.: Bitte benutze 4 Leerzeichen pro Einrückung.
zaine
User
Beiträge: 7
Registriert: Freitag 24. April 2009, 15:52

Erstmal danke für die Antwort.

Wie kann ich denn in der Schleife einstellen, das freundin bzw. wetter JA oder NEIN sein müssen?
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Außerdem kannst du den Code deutlich vereinfachen. Den String "Wiederholen?..." kannst du in einer Variable ablegen. Die ganzen prints brauchst du nicht unbedingt, du kannst mittels drei " oder ' einen Multiline String ausdrucken bzw in einer Variable ablegen. Also zb so:

Code: Alles auswählen

einleitungs_text = """Abfrageprogramm zur Freizeitgestaltung ....

Hier beginnt die dritte Zeile.

"""

print einleitungs_text
Sofern du schon Funktionen und allgemeine Datenstrukturen wie Wörterbücher / Dictionaries kennst, kannst du das Programm auch deutlich vereinfachen.

Zu deinem anfänglichen Problem noch: Du darfst dir eine Bedingung nicht so vorstellen, das "wetter or freundin == "JA"" beide Variablen nimmt und sie überprüft. Du musst schon explizit für jede Variable die Bedingung festlegen, "or" und "and" werden zur zum Verknüpfen mehrer Wahrheitswerte verwendet. Also musst du das auch immer so machen, wie du es in den if Abfragen machst.

EDIT:
Wie kann ich denn in der Schleife einstellen, das freundin bzw. wetter JA oder NEIN sein müssen?

Code: Alles auswählen

while (wetter == "JA" or wetter == "NEIN") or (freundin == "JA" or freundin == "NEIN"):
Ich glaube aber, du meinst, das beide wahr sein sollen? Dann musst du statt dem zentralen "or" and benutzen.

Hier ein paar fortschrittlichere Varianten:

Code: Alles auswählen

antwortmoeglichkeiten = ("JA", "NEIN")
while wetter in antwortmoeglichkeiten or freunding in antwortmoeglichkeiten:

Code: Alles auswählen

antwortmoeglichkeiten = ("JA", "NEIN")
while all(antwort in antwortmoeglichkeiten for antwort in (wetter, freundin)):
Das zweite wirst du aber als Einsteiger noch nicht verstehen / brauchen.
Zuletzt geändert von str1442 am Freitag 24. April 2009, 18:22, insgesamt 1-mal geändert.
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Edit: Ist nach str1442's edit überflüssig geworden, aber Deins war besser.

Hi,

Code: Alles auswählen

>>> freundin="JA"
>>> freundin in ["JA","NEIN"]
True
>>> freundin="Hallo!"
>>> freundin in ["JA","NEIN"]
False
Hilft Dir das beim selber lösen?

Im Grund hast Du doch eine Liste mit möglichen Antworten. Die Antwort auf die Freundin-Frage muss in dieser Liste sein und die Antwort auf die Wetter-Frage muss in dieser Liste sein.

Gruß,
Bernhard
problembär

@Bernhard: Wenn Du Listen nicht verändern willst, nimm' lieber Tupels: Werden in der Regel schneller verarbeitet.

Ansonsten: Hmm, immer noch uncool:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

def getAnswer(question):

    possibleanswers = ("JA", "NEIN") 

    answer = raw_input(question)

    retval = ["", 0]

    if answer in possibleanswers:
        retval[0] = answer 
        retval[1] = 1 
    else:
        retval[0] = "" 
        retval[1] = 0

    return retval


def checkResult(wetter, freundin):

    advices = ("Wenn du schon alleine bist, solltest du ein Buch lesen.",
               "Dann geh jetzt zum Fußballspiel.",
               "Dann ab mit dir in das Kino!",
               "Am Besten gehst du spazieren.")

    res = ["0", "0"]

    if wetter == "JA":
        res[1] = "1"

    if freundin == "JA":
        res[0] = "1"

    print advices[int("".join(res), 2)]

    return raw_input("Wiederholen? (JA/NEIN): ")


whd = ""

while whd != "NEIN":

    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!)"
    print

    first = True

    questions = ("Ist draußen denn gerade schönes Wetter? ",
                 "Und hat deine Freundin momentan Zeit für dich? ")
    ok = 0

    while ok < 2:

        if not first:

            print "Bitte nur mit JA oder NEIN antworten, Abfrage wird wiederholt."
            print "(Nur in Großbuchstaben JA oder NEIN eingeben!)"
            print

        first = False

        answers = []

        for i in questions:
            answers.append(getAnswer(i))

        wetter = answers[0][0]
        freundin = answers[1][0]

        for i in answers:
            ok += i[1]

    whd = checkResult(wetter, freundin)
Gruß
zaine
User
Beiträge: 7
Registriert: Freitag 24. April 2009, 15:52

@All: Danke^^

@Problembär: Oh nein, das ist viel zu kompliziert. Wir kennen erst raw_input und print, ich selber arbeite erst seit einer halben Stunde mit Python. Sowas kommt später^^.

@Bernhard: Danke, jetzt habe ich es verstanden.

@str1442:

Jetzt sieht es bei mir so aus:

Code: Alles auswählen

antworten = ("JA", "NEIN")
whd = ""
while whd != "NEIN":
     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!)")
     print ("")
     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 in antworten and freundin in antworten:

         if wetter == "JA" and freundin == "NEIN":
             print "Dann geh jetzt zum Fußballspiel."
             whd = raw_input ("Wiederholen? (JA/NEIN): ")
             break
    
         if wetter == "JA" and freundin == "JA":
             print "Am Besten gehst du spazieren."
             whd = raw_input ("Wiederholen? (JA/NEIN): ")
             break
    
         if wetter == "NEIN" and freundin == "NEIN":
             print "Wenn du schon alleine bist, solltest du ein Buch lesen."
             whd = raw_input ("Wiederholen? (JA/NEIN): ")
             break
    
         if wetter == "NEIN" and freundin == "JA":
             print "Dann ab mit dir in das Kino!"
             whd = raw_input ("Wiederholen? (JA/NEIN): ")
             break

     else:
            print "Bitte nur mit JA oder NEIN antworten, Abfrage wird wiederholt."
            print "(Nur in Großbuchstaben JA oder NEIN eingeben!)"
            print ""
            wetter = raw_input ("Ist draußen denn gerade schönes Wetter? ") 
            freundin = raw_input ("Und hat deine Freundin momentan Zeit für dich? ")
Das Symptom ist allerdings immernoch das gleiche wie vorhin =/.

Also, nochmal zur Erklärung:

Der Benutzer soll 2 Fragen hintereinander mit JA oder NEIN beantworten. Schreibt er etwas anderes, zum Beispiel JAPADAPADU, soll die Schleife aktiviert werden, damit der Benutzer auf seinen Fehler hingewiesen wird und die Fragen erneut gestellt werden.

Die Schleife soll sich also nur dann aktivieren, wenn bei wetter oder freundin weder JA noch NEIN eingegeben werden, sonst nicht. Das Problem ist, das sich die Schleife manchmal auch dann aktiviert, wenn 2x korrekte Antworten gegeben werden. Diesen Fehler möchte ich nur korrigieren, so einfach wie möglich.

EDIT: Ich möchte nicht von euch meine Hausaufgaben gelöst bekommen, ich würde nur gerne wissen, warum es bei mir nicht funktioniert.^^ Denn der eigentliche Script (2 Fragen + die 4 Antwortmöglichkeiten) funktioniert reibungslos.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

@zaine: Dann musst du einfach beide Abfragen negieren:

Code: Alles auswählen

while wetter not in antworten or freundin not in antworten:
Das liest sich dann als "Solange wetter nicht in antworten ist oder freundin nicht in antworten ist, tue: ..."

@problembär:

Dein Code hat ein paar Probleme. retval sollte wenn schon ein Tupel sein, da eine Liste impliziert, das die einzelnen Daten mehr oder weniger gleich sind und keine besondere Bedeutung haben. Du benutzt die Liste aber um eine Antwort / einen leeren String und einen Wahrheitswert zu definieren. Warum benutzt du 0 und 1 als Wahrheitswert an der Stelle? Warum gibst du überhaupt die Antwort zurück und nicht nur den Wahrheitswert? Nur damit du nochmal explizit auf Ja oder Nein in checkResult prüfen kannst? Das ist unnötige Kopplung. Gleichzeitig benutzt du den "Wahrheitswert" aus getAnswer, der wohl doch keiner sein soll, um "ok" hochzuzählen. Also soll dieser Wert angeben, ob eine valide Antwortmöglichkeit übergeben wurde. Warum sollte getAnswer soetwas zurückgeben? Warum gibt getAnswer nicht einfach nur True / False als Wahrheitswert zurück? Das ist so direkt nicht ersichtlich. mit "ok < 2" "hardcodierst" du wiederrum die Anzahl an Fragen fest in die Schleife.

Die Lösung mittels 2 Bit, die Wahrheitswerte angeben, als int zu interpretieren und dann zu benutzen ist zwar kreativ, erinnert aber an eine "C" Heransgehensweise. Will man ein solches Programm besser ausbauen, könnte man einen binären Baum verwenden, der die jeweiligen Antworten als Blätter-Knotenobjekt enthält. Drückt imho den Zweck besser aus.

Warum sind advices und possibleanswers keine globalen Konstanten?

Dann noch PEP8 und eventuell weniger Leerzeilen. Normalerweise stellen die Leerzeilen eine Art logischen Abschnitt dar; alles, was ohne Leerzeilen geschrieben wird, gehört irgendwie zusammen. So würde ich bei while und if keine Leerzeilen setzen. Nach "def" auch nicht. Und raw_input sollte man eigentlich nur auf der höchsten Ebene benutzen und die Werte dann in die Funktionen runterreichen, anstatt einfach mitten in der Funktion raw_input zu verwenden. Aus dem gleichen Grund, aus dem man nicht einfach sys.exit in einer Funktion benutzen sollte.
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hallo zaine,

erstmal Glückwunsch: Dein Code ist viel übersichtlicher geworden. Dennoch hast Du anscheinend den Überblick darüber verloren: Du willst ein und denselben Ablauf immer wieder wiederholen bis jemand sagt, dass er keine Wiederholung mehr will.
Wenn Du nur einen Vorgang wiederholen willst, warum hast Du dann zwei "while"-Schleifen? Geht das nicht auch mit einer?
Warum hast Du so oft den gleichen Code der fragt, ob nochmal wiederholt werden soll, obwohl der sich doch auch bei jedem Durchlauf wiederholt? Kann man den nicht irgendwo ein einziges Mal in die Schleife schreiben? Zum Beispiel an deren Ende, wenn es sich entscheidet, ob sie neu durchlaufen wird?
Mach Dir nochmal die Struktur klar und schreib neuen guten Ablaufcode anstatt an dem alten festzuhalten.

Gruß,
Bernhard
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Ok, wenn Du die Frage in meinem letzten Post beantwortet hast, dann zeige ich Dir hier einen funktionierenden Code, der while-Schleifen in einer while-Schleife sinnvoll nutzt. Schau ihn Dir erst an, nachdem Du über Deinen eigenen Code nachgedacht hast.

Code: Alles auswählen

antworten = ("JA", "NEIN")
whd = ""
wetter=''
freundin=''
while whd != "NEIN":
    print ("---------------------------------------------------------------")
    print ("Abfrageprogramm zur Freizeitgestaltung von maennlichen Menschen")
    print ("---------------------------------------------------------------")
    print ("Bitte nur mit JA oder NEIN antworten.")
    print ("(Andere Eingaben werden NICHT akzeptiert!)")
    print ("")
    #jede einzelne Frage wird jetzt wiederholt, bis die Antwort passt.
   #dafuer lohnt sich dann auch eine Schachtelung von Schleifen. 
    while wetter not in antworten:
        wetter = raw_input ("Ist draussen denn gerade schoenes Wetter? ")
        if wetter not in antworten:
            print "Ich habe doch gesagt JA oder NEIN. Also nochmal:"
    #dasselbe noch mal mit der Freundin-Frage
    while freundin not in antworten:
        freundin = raw_input ("Und hat deine Freundin momentan Zeit fuer dich? ")
        if freundin not in antworten:
            print "Los Freundchen, jetzt mal mit JA oder NEIN:"
            
     # if wetter in antworten and freundin in antworten (dieses if braucht man jetzt nicht mehr)
    if wetter == "JA" and freundin == "NEIN":
        print "Dann geh jetzt zum Fussballspiel."

    if wetter == "JA" and freundin == "JA":
        print "Am Besten gehst du spazieren."

    if wetter == "NEIN" and freundin == "NEIN":
        print "Wenn du schon alleine bist, solltest du ein Buch lesen."

    if wetter == "NEIN" and freundin == "JA":
        print "Dann ab mit dir in das Kino!"
     #und nochmal eine Schleife um den User zu einer passenden Antwort zu nötigen:
    whd =""
    while whd not in antworten :
        whd = raw_input ("Wiederholen? (JA/NEIN): ")
        if whd not in antworten:
            print "Bitte nur mit JA oder NEIN antworten, Abfrage wird wiederholt."
            print "(Nur in Grossbuchstaben JA oder NEIN eingeben!)"
    wetter = ''         #weil wir das in Zeile 14 und 19 wieder brauchen
    freundin = ''
Zuletzt geändert von Bernhard am Freitag 24. April 2009, 20:04, insgesamt 1-mal geändert.
zaine
User
Beiträge: 7
Registriert: Freitag 24. April 2009, 15:52

Haha, sorry Bernhard, aber ich hab gerade selber mein Problem lösen können ohne deinen Code gesehen zu haben :) . Hab wie du es gesagt hast die Schleifen überdacht und kurzerhand einige Teile neu positioniert. Ergebnis: Alles läuft wie gewünscht. Hab jetzt noch diverse print Befehle hinzugefügt wegen ästhetischen Gründen, deshalb sieht der Script jetzt größer aus.

Hier der Code:

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!)"
    print ""

    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 "(Nur in Großbuchstaben JA oder NEIN eingeben!)"
            print ""
            print ""
            print ""
            wetter = raw_input ("Ist draußen denn gerade schönes Wetter? ") 
            freundin = raw_input ("Und hat deine Freundin momentan Zeit für dich? ")
    else:
           if wetter == "JA" and freundin == "NEIN":
             print ""
             print "Dann solltest du zum heutigen Fußballspiel gehen."
             print ""
             print ""
             print ""
             whd = raw_input ("Wiederholen? Zum Schließen ENDE eingeben: ")
             
           if wetter == "JA" and freundin == "JA":
             print ""
             print "Wenn das so ist, geh am Besten im Park spazieren"
             print ""
             print ""
             print ""
             whd = raw_input ("Wiederholen? Zum Schließen ENDE eingeben:")
             
           if wetter == "NEIN" and freundin == "NEIN":
             print ""
             print "Wenn du schon alleine bist, solltest du ein Buch lesen."
             print ""
             print ""
             print ""
             whd = raw_input ("Wiederholen? Zum Schließen ENDE eingeben: ")
             
           if wetter == "NEIN" and freundin == "JA":
             print ""
             print "Na wie wäre es dann, wenn ihr beide jetzt ins Kino geht?"
             print ""
             print ""
             print ""
             whd = raw_input ("Wiederholen? Zum Schließen ENDE eingeben: ")
               

         

    



Zuletzt geändert von zaine am Freitag 24. April 2009, 20:06, insgesamt 1-mal geändert.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Strings haben eine __mul__-Methode, d.h. du kannst

Code: Alles auswählen

print '-' * 30
schreiben.
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hi,

das freut mich, wenn's gefruchtet hat. Dennoch zwei Fragen:

1) Was würde passieren, wenn Du dieses "else" einfach löschen und die darunter kommenden Zeilen weniger weit einrücken würdest?

2) Warum muss in Zeile 29, 37, 45 und 53 dasselbe stehen? Geht das auch eleganter? Kann man das so in die Schleife platzieren, dass man es nur einmal eintippen muss?

Gruß,
Bernhard
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Die ganzen

Code: Alles auswählen

print ""
vermeide ich, indem ich z.B.

Code: Alles auswählen

print "\nDann solltest du zum heutigen Fußballspiel gehen.\n\n\n"
Zu 2.: Die Zeilen 29, 37 und 45 löschen und Zeile 53 um eine Ebene ausrücken. Achja, Zeile 54-62 kann man natürlich auch löschen :wink:

EDIT: Den while-else Konstrukt brauchst du hier nicht. Der else-Teil wird nur dann ausgeführt, wenn kein break in der while-Schleife ausgeführt wurde, was hier ja immer der Fall ist.
zaine
User
Beiträge: 7
Registriert: Freitag 24. April 2009, 15:52

@derdon und bernhard: Danke^^

Hier die aktuelle Version (und vermutlich auch vorletzte):

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"
            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: ")

Wesentlich besser :)

Und wegen der "ENDE-Wiederholung": Ist sicher nicht sehr elegant, aber ich möchte versuchen, den Code so kurz wie möglich zu halten. Und eine Zeile pro Antwort bräuchte ich ja sowieso =).

Als nächstes änder ich die beiden Fragen um.^^
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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

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:

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

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

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