Anfänger Problem mit Python

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
Kriegsfee
User
Beiträge: 9
Registriert: Samstag 9. Januar 2010, 13:34

Hallo! Ich weiß nicht, wohin damit, also ins Allgemeine Fragen - Board :)
Ich hab heute früh (um 1...^^) mit Python angefangen und habe keinerlei Programmiererfahrung. Nach dem Einlesen hab ich veersucht, mein erstes "Programm" mit PyScripter zu schreiben (da mir nichts eingefallen ist, was ich brauche und auch kann, hab ich das erste geschrieben, was mir in den Kopf kam und einfach war ;)):

Code: Alles auswählen

text1 = "the game"
text2 = "Boxxy"
text3 = "Jews did WTC"
text4 = "Niggers love Watermelons and Chicken"
text5 = "Newfag"
text6 = "An Hero"
text7 = "Yo dawg"
text8 = "Rule 34"

meme = raw_input("What kind of meme would you like to see? Interesting, Stupid, Porn or Racist?")
if (meme == "Interesting" or "interesting"):
    print text1
    print text6
else:
    if (meme == "Stupid" or "stupid"):
        print text2
        print text5
    else:
        if (meme == "Racist" or "racist"):
         print text3
         print text4
         print text7
        else:
            if (meme == "Porn" or "porn"):
                print text8
            else:
                print ("ERROR! Wrong meme picked!")
Interessanterweise gibt das Script IMMER text1 und text2 aus, egal was ich eingebe. Meine Eingabe wird also völlig ignoriert.
Wieso?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Weil ``or`` schwächer bindet als ``==``(und selbst wenn es das nicht täte wäre der Ausdruck falsch). Im ``if``(bei dem du übrigens keine Klammern bauchst) steht also:

Code: Alles auswählen

(meme == "Interesting") or "interesting"
was immer ``True`` ist. Du willst aber ein

Code: Alles auswählen

meme == "Interesting" or meme == "interesting"
oder kürzer

Code: Alles auswählen

meme in ("Interesting", "interesting")
oder noch besser:

Code: Alles auswählen

meme.lower() == "interesting"
Zuletzt geändert von Darii am Samstag 9. Januar 2010, 13:51, insgesamt 2-mal geändert.
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Kriegsfee
User
Beiträge: 9
Registriert: Samstag 9. Januar 2010, 13:34

Danke für die schnelle Hilfe! Gleich mal weiter schreiben :)
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

Hallo Kriegsfee
ich habe noch einen verbesserungsvorschlag für dein programm
man könnte eine while-Schleife einbauen
das ganze würde dann so aussehen:

Code: Alles auswählen

text1 = "the game" 
text2 = "Boxxy" 
text3 = "Jews did WTC" 
text4 = "Niggers love Watermelons and Chicken" 
text5 = "Newfag" 
text6 = "An Hero" 
text7 = "Yo dawg" 
text8 = "Rule 34" 

ende = False
while ende == False:
    meme = raw_input("What kind of meme would you like to see? Interesting, Stupid, Porn or Racist, (Ende)?") 
    if meme.upper() == "INTERESTING": 
        print text1 
        print text6 
     
    elif meme.upper() == "STUPID": 
        print text2 
        print text5 
     
    elif meme.upper() == "RACIST": 
        print text3 
        print text4 
        print text7 
            
    elif meme.upper() == "PORN": 
        print text8

    elif meme.upper() == "ENDE": 
        print "Bye Bye"
        ende = True
        
    else: 
        print "ERROR! Wrong meme picked!"

    print"-------------------------------------------------------------------"
mfg
LP640
Kriegsfee
User
Beiträge: 9
Registriert: Samstag 9. Januar 2010, 13:34

LP640 hat geschrieben:Hallo Kriegsfee
ich habe noch einen verbesserungsvorschlag für dein programm
man könnte eine while-Schleife einbauen
das ganze würde dann so aussehen:

Code: Alles auswählen

text1 = "the game" 
text2 = "Boxxy" 
text3 = "Jews did WTC" 
text4 = "Niggers love Watermelons and Chicken" 
text5 = "Newfag" 
text6 = "An Hero" 
text7 = "Yo dawg" 
text8 = "Rule 34" 

ende = False
while ende == False:
    meme = raw_input("What kind of meme would you like to see? Interesting, Stupid, Porn or Racist, (Ende)?") 
    if meme.upper() == "INTERESTING": 
        print text1 
        print text6 
     
    elif meme.upper() == "STUPID": 
        print text2 
        print text5 
     
    elif meme.upper() == "RACIST": 
        print text3 
        print text4 
        print text7 
            
    elif meme.upper() == "PORN": 
        print text8

    elif meme.upper() == "ENDE": 
        print "Bye Bye"
        ende = True
        
    else: 
        print "ERROR! Wrong meme picked!"

    print"-------------------------------------------------------------------"
mfg
LP640
Yeah! Sehr gut, danke! Genau das wollte ich! Also eine while-Schleife, wieder was gelernt :)

Zwei Fragen: Wieso "ende = False" am Anfang?
das .upper () lässt das Script die Groß/Kleinschreibung ignorieren?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ad 1) Weil `ende` einen Wert haben bzw. ueberhaupt erst existieren muss. `while not ende` waere btw besser.
Ad 2) nein `upper` erzeugt eine Version des Strings bei dem alle Zeichen gross sind. Mach dich am besten gleich mit der Library Reference bekannt oder lese das Tutorial, falls du das noch nicht getan hast.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mich wundert es stark, dass noch niemand über text1, text2, ... gemeckert hat! (Oder hab ich das irgend wo implizit überlesen?)

Also, @OP:
Quasi immer, wenn Du Bezeichner nummerierst, machst Du schon einen Designfehler und solltest lieber eine Liste, Tupel o.ä. verwenden!

Code: Alles auswählen

#text1 = "the game"
#text2 = "Boxxy"
#text3 = "Jews did WTC"
#text4 = "Niggers love Watermelons and Chicken"
#text5 = "Newfag"
#text6 = "An Hero"
#text7 = "Yo dawg"
#text8 = "Rule 34" 
# besser als Tupel
text = (
    "the game",
    "Boxxy",
    ...
)

# Zugriff per Index
print text[0]

# Ausgabe mit "".join()
print "\n".join(text[2:4])
Edit: Auch wenn's leicht OT ist:
Ich "muss" mich gerade mit einer Java Hausaufgabe einer Freundin von mir befassen... hier mal die Vorgabe der Übungsveranstalter. *würg*
Code Vorgabe
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hyperion hat geschrieben:Mich wundert es stark, dass noch niemand über text1, text2, ... gemeckert hat! (Oder hab ich das irgend wo implizit überlesen?)
Bei dem inhalt hab ich das explizit ueberlesen ;) Allerdings kann man den "Texten" ja auch einen sprechenden Namen geben, insofern ist ein Dictionary evtl besser als eine Liste/Tupel

Zum Java-Source: Nuja, vielleicht hat das ja paedagogische gruende kein Array oder aehnliches zu verwenden *duck*
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

cofi hat geschrieben:
Hyperion hat geschrieben:Mich wundert es stark, dass noch niemand über text1, text2, ... gemeckert hat! (Oder hab ich das irgend wo implizit überlesen?)
Bei dem inhalt hab ich das explizit ueberlesen ;) Allerdings kann man den "Texten" ja auch einen sprechenden Namen geben, insofern ist ein Dictionary evtl besser als eine Liste/Tupel
Danke für die Ergänzung :-)
Zum Java-Source: Nuja, vielleicht hat das ja paedagogische gruende kein Array oder aehnliches zu verwenden *duck*
Hm... ich hatte eine Aufgabe schon einmal mit einer ArrayList gelöst und entsprechend nur das Interface List<"Object"> als Typ definiert - ich denke das dürfte den Hiwis auffallen :-D
Nun ja, ich fürchte fast, dass diese "Spezialisten" aus unserem Institut einfach keine Ahnung von Didaktik und Pädagogik haben. (Denn dann würde ja die Folgeaufgabe erforderlich sein, in der es dann in idiomatisch richtig und elegant gelöst wird - so wie ich group by bei SQL auch erst nach 10 Queries mit speziellem where erkläre ;-) )
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

so hier die "perfekte" lösung

Code: Alles auswählen

text = ("the game","Boxxy","Jews did WTC","Niggers love Watermelons and Chicken","Newfag","An Hero","Yo dawg","Rule 34")

ende = False
while not ende:
    meme = raw_input("What kind of meme would you like to see? Interesting, Stupid, Porn or Racist, (Ende)?") 
    if meme.upper() == "INTERESTING": 
        print text[0]
        print text[5]
     
    elif meme.upper() == "STUPID": 
        print text[1]
        print text[4] 
     
    elif meme.upper() == "RACIST": 
        print text[2]
        print text[3]
        print text[6]
            
    elif meme.upper() == "PORN": 
        print text[7]

    elif meme.upper() == "ENDE": 
        print "Bye Bye"
        ende = True
        
    else: 
        print "ERROR! Wrong meme picked!"

    print"-------------------------------------------------------------------"
mfg
LP640
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Meine Version, ungetestet:

Code: Alles auswählen

text = ("the game","Boxxy","Jews did WTC","Niggers love Watermelons and Chicken","Newfag","An Hero","Yo dawg","Rule 34")

while True:
    meme = raw_input("What kind of meme would you like to see? Interesting, Stupid, Porn or Racist, (Ende)?")
    mapper = {
        "interesting": ((0, 5), False),
        "stupid": ((1, 4), False),
        "ende": ((), True)
        # and so on ...
    }
    try:
        param, state = mapper[meme.lower()]
        if not state:
            print "\n".join(map(text.get, param))
        else:
            break
    except KeyError, e:
        print "Error, wrong 'meme' picked..."
    print "-"*79
Kriegsfee
User
Beiträge: 9
Registriert: Samstag 9. Januar 2010, 13:34

Danke nochmal, daraus kann ich viel lernen!
BlackJack

@LP640: Gut dass das Wort in Anführungszeichen steht. :-)

Code: Alles auswählen

def main():
    meme2texts = {
        'interesting': ['the game', 'An Hero'],
        'stupid': ['Boxxy', 'Newfaq'],
        'racist': ['Jews did WTC',
                   'Niggers love Watermelons and Chicken',
                   'Yo dawg'],
        'porn': ['Rule 34']
    }


    while True:
        prompt = ('What kind of meme would you like to see?\n' +
                  ('%s, or ende? ' % ', '.join(meme2texts.iterkeys()))
                      .capitalize())
        meme = raw_input(prompt).lower()
        if meme == 'ende':
            break
        print '\n'.join(meme2texts.get(meme, ['Error! Wrong meme picket!']))
        print '-' * 75


if __name__ == '__main__':
    main()
Kriegsfee
User
Beiträge: 9
Registriert: Samstag 9. Januar 2010, 13:34

Um Gottes Willen...jetzt wirds unübersichtlich für mich^^

Was bringt das break?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Springt aus einer Schleife (`for` oder `while`) raus. Du hast Recht, das ist in der Tat unübersichtlich :-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Zu `break` (Selbstreferenzen sind cool 8))
Das ist uebrigens genau der Punkt an dem du mit dem Tutorial wirklich anfangen solltest ;)
Eventuell nicht mit dem hier, da es Python 3 spezifisch ist.

Hmm .. aber dass du nicht nach dem ifmain Idiom gefragt hast ...
Zuletzt geändert von cofi am Sonntag 10. Januar 2010, 12:58, insgesamt 1-mal geändert.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Hyperion hat geschrieben:hier mal die Vorgabe der Übungsveranstalter. *würg*
In der Tat, würg. Bestellt dem Menschen einen schönen Grus und weist ihn mal auf http://java.sun.com/docs/codeconv/html/ ... C.doc.html hin. Man kann's auch in Java übersichtlich hinschreiben. Und vor mehr Jahren als der Mensch da wahrscheinlich Java schreibt, wurde auch in Java ein enum hinzugefügt... Fast jede Zeile in der Vorgabe da ist kritikwürdig.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

sma hat geschrieben:
Hyperion hat geschrieben:hier mal die Vorgabe der Übungsveranstalter. *würg*
In der Tat, würg. Bestellt dem Menschen einen schönen Grus und weist ihn mal auf http://java.sun.com/docs/codeconv/html/ ... C.doc.html hin. Man kann's auch in Java übersichtlich hinschreiben. Und vor mehr Jahren als der Mensch da wahrscheinlich Java schreibt, wurde auch in Java ein enum hinzugefügt... Fast jede Zeile in der Vorgabe da ist kritikwürdig.
Ich kenne die Person ganz gut - aber da ich bei seinem Chef noch durch eine Prüfung muss, halte ich mal im Moment meine Klappe... außerdem dürfte ich die Aufgabe offziell ja nicht kennen ^^ Aber wenn's dann im Frühjahr vorbei ist, werde ich sicherlich mal nen Pamphlet zur Ausbildung in Sachen Programmierung an der TU Clausthal verfassen.

*seufz* leider muss ich das jetzt mal schnell coden... ist ja für ne Frau, nimmt man auch schon mal Schmerzen in Kauf :-D
Antworten