spielkarte raten problem

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.
mhoch2
User
Beiträge: 2
Registriert: Dienstag 3. November 2015, 12:37

Hallo Freunde,

wir habe gerade in der Schule angefangen mit Python 3.5.0 zu programmieren.
Unsere Aufgabe ist es ein Programm zu schreiben was eine Karte des französischen Blattes zu errät.
Wir sollen mit ja und nein Antworten. Man darf nur if und else verwenden. Was ich aber nicht hinbekomme.
Es soll so kurz wie möglich sein. Hier mein Vorschlag(enthält aber Fehler):

#=========================================

#Eingabe
print("Ziehen sie eine Karte")
zahl=input("Ist die Karte eine Zahl? <j, n>:")
if zahl=="j":
farbe=input("Ist die Karte rot? <j, n>:")
if farbe=="j":
herz=input("Ist die Karte Herz? <j, n>:")
if herz=="j":
g8=input("Ist die Zahl auf der Karte unter 8 oder gleich 8? <j, n>:")
if g8=="j":
gerade=input("Ist die Zahl gerade? <j,n>:")
if gerade=="j":
print("Es ist die Herz 8")
elif gerade=="n":
print("Es ist eine Herz 7")
else:
print("Bitte nur j für ja und n für nein eingeben")
elif g8=="n":
gerade=input("Ist die Zahl gerade? <j,n>:")
if gerade=="j":
print("Es ist die Herz 10")
elif gerade=="n":
print("Es ist eine Herz 9")
else:
print("Bitte nur j für ja und n für nein eingeben")
else:
print("Bitte nur j für ja und n für nein eingeben")
elif herz=="n":
g8=input("Ist die Zahl auf der Karte unter 8 oder gleich 8? <j, n>:")
if g8=="j":
gerade=input("Ist die Zahl gerade? <j,n>:")
if gerade=="j":
print("Es ist die Karo 8")
elif gerade=="n":
print("Es ist eine Karo 7")
else:
print("Bitte nur j für ja und n für nein eingeben")
elif g8=="n":
gerade=input("Ist die Zahl gerade? <j,n>:")
if gerade=="j":
print("Es ist die Karo 10")
elif gerade=="n":
print("Es ist eine Karo 9")
else:
print("Bitte nur j für ja und n für nein eingeben")
else:
print("Bitte nur j für ja und n für nein eingeben")
else:
print("Bitte nur j für ja und n für nein eingeben")
elif farbe=="n":
kreuz=input("Ist die Karte Kreuz? <j, n>:")
if kreuz=="j":
g8=input("Ist die Zahl auf der Karte unter 8 oder gleich 8? <j, n>:")
if g8=="j":
gerade=input("Ist die Zahl gerade? <j,n>:")
if gerade=="j":
print("Es ist die Kreuz 8")
elif gerade=="n":
print("Es ist eine Kreuz 7")
else:
print("Bitte nur j für ja und n für nein eingeben")
elif g8=="n":
gerade=input("Ist die Zahl gerade? <j,n>:")
if gerade=="j":
print("Es ist die Kreuz 10")
elif gerade=="n":
print("Es ist eine Kreuz 9")
else:
print("Bitte nur j für ja und n für nein eingeben")
elif kreuz=="n":
g8=input("Ist die Zahl auf der Karte unter 8 oder gleich 8? <j, n>:")
if g8=="j":
gerade=input("Ist die Zahl gerade? <j,n>:")
if gerade=="j":
print("Es ist die Pik 8")
elif gerade=="n":
print("Es ist eine Pik 7")
else:
print("Bitte nur j für ja und n für nein eingeben")
elif g8=="n":
gerade=input("Ist die Zahl gerade? <j,n>:")
if gerade=="j":
print("Es ist die Pik 10")
elif gerade=="n":
print("Es ist eine Pik 9")
else:
print("Bitte nur j für ja und n für nein eingeben")
else:
print("Bitte nur j für ja und n für nein eingeben")
else:
print("Bitte nur j für ja und n für nein eingeben. Versuchen sie es nochmal")
elif zahl=="n":
farbe=input("Ist die Karte rot? <j, n>:")
if farbe=="j":
herz=input("Ist die Karte Herz? <j, n>:")
if herz=="j":
könig=input("Ist die Karte ein König? <j, n>:")
if könig=="j":
print("Es ist ein Herz König")
elif könig=="n":
dame=input("Ist die Karte eine Dame? <j, n>:")
else:
print("Bitte nur j für ja und n für nein eingeben")
if dame=="j":
print("Es ist eine Herz Dame")
elif dame=="n":
bube=input("Ist die Karte ein Bube? <j, n>:")
else:
print("Bitte nur j für ja und n für nein eingeben")
if bube=="j":
print("Es ist ein Herz Bube")
elif bube=="n":
print("Es ist ein Herz Ass")
else:
print("Bitte nur j für ja und n für nein eingeben")
elif herz=="n":
könig=input("Ist die Karte ein König? <j, n>:")
if könig=="j":
print("Es ist ein Karo König")
elif könig=="n":
dame=input("Ist die Karte eine Dame? <j, n>:")
else:
print("Bitte nur j für ja und n für nein eingeben")
if dame=="j":
print("Es ist eine Karo Dame")
elif dame=="n":
bube=input("Ist die Karte ein Bube? <j, n>:")
else:
print("Bitte nur j für ja und n für nein eingeben")
if bube=="j":
print("Es ist ein Karo Bube")
elif bube=="n":
print("Es ist ein Karo Ass")
else:
print("Bitte nur j für ja und n für nein eingeben")
else:
print("Bitte nur j für ja und n für nein eingeben")
elif farbe=="n":
kreuz=input("Ist die Karte Kreuz? <j, n>:")
if kreuz=="j":
könig=input("Ist die Karte ein König? <j, n>:")
if könig=="j":
print("Es ist ein Kreuz König")
elif könig=="n":
dame=input("Ist die Karte eine Dame? <j, n>:")
else:
print("Bitte nur j für ja und n für nein eingeben")
if dame=="j":
print("Es ist eine Kreuz Dame")
elif dame=="n":
bube=input("Ist die Karte ein Bube? <j, n>:")
else:
print("Bitte nur j für ja und n für nein eingeben")
if bube=="j":
print("Es ist ein Kreuz Bube")
elif bube=="n":
print("Es ist ein Kreuz Ass")
else:
print("Bitte nur j für ja und n für nein eingeben")
elif kreuz=="n":
könig=input("Ist die Karte ein König? <j, n>:")
if könig=="j":
print("Es ist ein Kreuz König")
elif könig=="n":
dame=input("Ist die Karte eine Dame? <j, n>:")
else:
print("Bitte nur j für ja und n für nein eingeben")
if dame=="j":
print("Es ist eine Kreuz Dame")
elif dame=="n":
bube=input("Ist die Karte ein Bube? <j, n>:")
else:
print("Bitte nur j für ja und n für nein eingeben")
if bube=="j":
print("Es ist ein Kreuz Bube")
elif bube=="n":
print("Es ist ein Kreuz Ass")
else:
print("Bitte nur j für ja und n für nein eingeben")
else:
print("Bitte nur j für ja und n für nein eingeben")
else:
print("Bitte nur j für ja und n für nein eingeben. Versuchen sie es nochmal")
else:
print("Bitte nur j für ja und n für nein eingeben. Versuchen sie es nochmal")

Vielen dank für die Antworten

L.G
mhoch2
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Was genau ist denn deine Frage?

Edit: Und könntest du deinen Code in Code-Tags setzen, damit die Einrückung erhalten bleibt? Beitrag editieren,Code markieren und einmal den Button "Code" über dem Eingabefeld drücke. Tags setzt der Editor dann automatisch.
BlackJack

@mhoch2: Ich würde ja die Frage nach der Farbe und die nach dem Wert/Bild der Karte trennen, dann hat man am Ende etwas weniger Code.
mhoch2
User
Beiträge: 2
Registriert: Dienstag 3. November 2015, 12:37

Code: Alles auswählen

#Eingabe
print("Ziehen sie eine Karte")
zahl=input("Ist die Karte eine Zahl? <j, n>:")
if zahl=="j":
    farbe=input("Ist die Karte rot? <j, n>:")
    if farbe=="j":
        herz=input("Ist die Karte Herz? <j, n>:")
        if herz=="j":
           g8=input("Ist die Zahl auf der Karte unter 8 oder gleich 8? <j, n>:")
           if g8=="j":
               gerade=input("Ist die Zahl gerade? <j,n>:")
               if gerade=="j":
                   print("Es ist die Herz 8")
               elif gerade=="n":
                   print("Es ist eine Herz 7")
               else:
                   print("Bitte nur j für ja und n für nein eingeben")
           elif g8=="n":
               gerade=input("Ist die Zahl gerade? <j,n>:")
               if gerade=="j":
                   print("Es ist die Herz 10")
               elif gerade=="n":
                   print("Es ist eine Herz 9")
               else:
                   print("Bitte nur j für ja und n für nein eingeben")
           else:
               print("Bitte nur j für ja und n für nein eingeben")    
        elif herz=="n":
            g8=input("Ist die Zahl auf der Karte unter 8 oder gleich 8? <j, n>:")
            if g8=="j":
               gerade=input("Ist die Zahl gerade? <j,n>:")
               if gerade=="j":
                   print("Es ist die Karo 8")
               elif gerade=="n":
                   print("Es ist eine Karo 7")
               else:
                   print("Bitte nur j für ja und n für nein eingeben")
            elif g8=="n":
               gerade=input("Ist die Zahl gerade? <j,n>:")
               if gerade=="j":
                   print("Es ist die Karo 10")
               elif gerade=="n":
                   print("Es ist eine Karo 9")
               else:
                   print("Bitte nur j für ja und n für nein eingeben")
            else:
                print("Bitte nur j für ja und n für nein eingeben")    
        else:
            print("Bitte nur j für ja und n für nein eingeben")
    elif farbe=="n":
        kreuz=input("Ist die Karte Kreuz? <j, n>:")
        if kreuz=="j":
            g8=input("Ist die Zahl auf der Karte unter 8 oder gleich 8? <j, n>:")
            if g8=="j":
               gerade=input("Ist die Zahl gerade? <j,n>:")
               if gerade=="j":
                   print("Es ist die Kreuz 8")
               elif gerade=="n":
                   print("Es ist eine Kreuz 7")
               else:
                   print("Bitte nur j für ja und n für nein eingeben")
            elif g8=="n":
               gerade=input("Ist die Zahl gerade? <j,n>:")
               if gerade=="j":
                   print("Es ist die Kreuz 10")
               elif gerade=="n":
                   print("Es ist eine Kreuz 9")
               else:
                   print("Bitte nur j für ja und n für nein eingeben")
        elif kreuz=="n":
            g8=input("Ist die Zahl auf der Karte unter 8 oder gleich 8? <j, n>:")
            if g8=="j":
               gerade=input("Ist die Zahl gerade? <j,n>:")
               if gerade=="j":
                   print("Es ist die Pik 8")
               elif gerade=="n":
                   print("Es ist eine Pik 7")
               else:
                   print("Bitte nur j für ja und n für nein eingeben")
            elif g8=="n":
               gerade=input("Ist die Zahl gerade? <j,n>:")
               if gerade=="j":
                   print("Es ist die Pik 10")
               elif gerade=="n":
                   print("Es ist eine Pik 9")
               else:
                   print("Bitte nur j für ja und n für nein eingeben")
        else:
            print("Bitte nur j für ja und n für nein eingeben")
    else:
        print("Bitte nur j für ja und n für nein eingeben. Versuchen sie es nochmal")
elif zahl=="n":
    farbe=input("Ist die Karte rot? <j, n>:")
    if farbe=="j":
        herz=input("Ist die Karte Herz? <j, n>:")
        if herz=="j":
           könig=input("Ist die Karte ein König? <j, n>:")
           if könig=="j":
               print("Es ist ein Herz König")
           elif könig=="n":
               dame=input("Ist die Karte eine Dame? <j, n>:")
           else:
               print("Bitte nur j für ja und n für nein eingeben")
               if dame=="j":
                   print("Es ist eine Herz Dame")
               elif dame=="n":
                   bube=input("Ist die Karte ein Bube? <j, n>:")
               else:
                    print("Bitte nur j für ja und n für nein eingeben")
                    if bube=="j":
                        print("Es ist ein Herz Bube")
                    elif bube=="n":
                        print("Es ist ein Herz Ass")
                    else:
                       print("Bitte nur j für ja und n für nein eingeben")
        elif herz=="n":
            könig=input("Ist die Karte ein König? <j, n>:")
            if könig=="j":
               print("Es ist ein Karo König")
            elif könig=="n":
               dame=input("Ist die Karte eine Dame? <j, n>:")
            else:
                print("Bitte nur j für ja und n für nein eingeben")
                if dame=="j":
                     print("Es ist eine Karo Dame")
                elif dame=="n":
                     bube=input("Ist die Karte ein Bube? <j, n>:")
                else:
                    print("Bitte nur j für ja und n für nein eingeben")
                    if bube=="j":
                        print("Es ist ein Karo Bube")
                    elif bube=="n":
                        print("Es ist ein Karo Ass")
                    else:
                        print("Bitte nur j für ja und n für nein eingeben")
        else:
            print("Bitte nur j für ja und n für nein eingeben")
    elif farbe=="n":
        kreuz=input("Ist die Karte Kreuz? <j, n>:")
        if kreuz=="j":
            könig=input("Ist die Karte ein König? <j, n>:")
            if könig=="j":
               print("Es ist ein Kreuz König")
            elif könig=="n":
               dame=input("Ist die Karte eine Dame? <j, n>:")
            else:
                print("Bitte nur j für ja und n für nein eingeben")
                if dame=="j":
                    print("Es ist eine Kreuz Dame")
                elif dame=="n":
                   bube=input("Ist die Karte ein Bube? <j, n>:")
                else:
                    print("Bitte nur j für ja und n für nein eingeben")
                    if bube=="j":
                        print("Es ist ein Kreuz Bube")
                    elif bube=="n":
                        print("Es ist ein Kreuz Ass")
                    else:
                        print("Bitte nur j für ja und n für nein eingeben")
        elif kreuz=="n":
            könig=input("Ist die Karte ein König? <j, n>:")
            if könig=="j":
               print("Es ist ein Kreuz König")
            elif könig=="n":
               dame=input("Ist die Karte eine Dame? <j, n>:")
            else:
                print("Bitte nur j für ja und n für nein eingeben")
                if dame=="j":
                   print("Es ist eine Kreuz Dame")
                elif dame=="n":
                    bube=input("Ist die Karte ein Bube? <j, n>:")
                else:
                    print("Bitte nur j für ja und n für nein eingeben")
                    if bube=="j":
                       print("Es ist ein Kreuz Bube")
                    elif bube=="n":
                        print("Es ist ein Kreuz Ass")
                    else:
                        print("Bitte nur j für ja und n für nein eingeben")
        else:
            print("Bitte nur j für ja und n für nein eingeben")
    else:
        print("Bitte nur j für ja und n für nein eingeben. Versuchen sie es nochmal")
else:
    print("Bitte nur j für ja und n für nein eingeben. Versuchen sie es nochmal")


Meine Frage war, was ich falsch gemacht habe und Verbesserungsvorschläge.
BlackJack

@mhoch2: Da sind zu viele Wiederholungen drin. Die Frage ob die Karte rot ist oder ob sie beispielsweise ein König ist sollte im Code nur einmal auftauchen. Wie gesagt, ermittle Farbe und Wert getrennt, dann brauchst Du weniger Code.

Wenn Du sicherstellen willst das der Benutzer nur 'j' oder 'n' eingibt, dann schreib eine Fragefunktion die das sicherstellt, also den Benutzer solange fragt bis er eines von beidem eingegeben hat. So wie's da jetzt steht wird dem Benutzer zwar gesagt das er nur 'j' oder 'n' eingeben soll, aber der Code läuft dann ja einfach weiter. Das ist nicht sinnvoll.
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

ich finde deine abfragen zu speziell. du fragst explizit nach herz 8 und so.

du könntest erst fragen, ob zahl oder nicht.
dann grenzt du dies ein (zb bei zahlen: ist es 7 oder 8? wenn ja, frag nochmal genauer ob 7 sonst 8. ansonsten genauer ob 9 sonst 10)
damit kannst du in 3 abfragen rausfinden, welche zahl. und die verschachtelung ist auch recht schmal.

und ähnlich verfährst du mit den farben. erst fragen ob rot oder schwarz. bei rot ob herz oder karo.
sind nochmal 2 abfragen und du weißt alles. ebenfalls sehr wenig verschachtelung

diese zwei infos fügst du dann zusammen
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo mhoch2,

Deine Schulaufgabe wird ja mittlerweile fällig gewesen sein. Hier ein Vorschlag, wie so ungefähr Dein Programm aussehen könnte:

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-

def get_eingabe(anzeige):
    while 1:
        eingabe = raw_input(anzeige + ' >>> ')
        eingabe = eingabe.lower()
        if eingabe != 'j' and eingabe != 'n':
            print ("Beantworten Sie Fragen bitte nur mit \'j\' fuer ja und \'n\' für nein\n")
            continue
        return eingabe

if __name__ == "__main__":
    print "Es stehen die 32 Spielkarten mit den vier Zahlen-Werten\n" +\
        "  \'Sieben\' - \'Acht\'- \'Neun\' und \'Zehn\', den vier Bild-Werten\n" +\
        "  \'Bube\' - \'Dame\' - \'König\' und \'Ass\' in den vier Farben\n" +\
        "  \'Kreuz\' - \'Pik\' - \'Karo\' und \'Herz\' zur Auswahl. \n" +\
        "Merke Dir bitte eine dieser Karten und\n" +\
        "beantworte meine Fragen bitte nur mit \'j\' fuer ja und \'n\' für nein\n"
    
    eingabe = get_eingabe('Hat die Karte eine schwarze Farbe (Kreuz oder Pik)?')
    if eingabe == 'j':
        eingabe = get_eingabe('Ist es eine Pik-Karte?')
        if eingabe == 'j':
            farbe = 'Pik'
        else: farbe = 'Kreuz'
    else:
        eingabe = get_eingabe('Ist es eine Herz-Karte?')
        if eingabe == 'j':
            farbe = 'Herz'
        else: Farbe = 'Karo'        
    
    zahl = get_eingabe('Ist es eine Karte mit einem Zahlenwert?')
    if zahl == 'j':
        gerade = get_eingabe('Ist es eine gerade Zahl?')
        kleiner9 = get_eingabe('Ist die Zahl kleiner 9?')
    if zahl == 'j':    
        if gerade == 'j' and kleiner9 == 'j':            
            print('Dann hast Du Dir die ' + farbe + ' Acht gemerkt.')
        elif gerade == 'j' and kleiner9 == 'n':
            print('Dann hast Du Dir die ' + farbe + ' Zehn gemerkt.')
        elif gerade == 'n' and kleiner9 == 'j':    
            print('Dann hast Du Dir die ' + farbe + ' Sieben gemerkt.')
        elif gerade == 'n' and kleiner9 == 'n':       
            print('Dann hast Du Dir die ' + farbe + ' Neun gemerkt.')           
    else:
        herren = get_eingabe('Ist es eine Karte mit einem Herren (Bube oder König)?')
        groesserD = get_eingabe('Ist der Wert der Karte größer als der einer Dame?')
        if herren == 'j' and groesserD == 'j':
            print('Dann hast Du Dir den ' + farbe + ' König gemerkt.')
        elif herren == 'j' and groesserD == 'n':
            print('Dann hast Du Dir den ' + farbe + ' Buben gemerkt.')
        elif herren == 'n' and groesserD == 'n':
            print('Dann hast Du Dir die ' + farbe + ' Dame gemerkt.')
        elif herren == 'n' and groesserD == 'j':
            print('Dann hast Du Dir die ' + farbe + ' Ass gemerkt.')
Das sind jetzt nicht mehr knapp 200 sondern nur noch rund 60 Zeilen.

MfG, kodela
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@kodela: Für Wahrheitswerte gibt es Python explizite Singletons True und False, die man statt Integerwerte 1 oder 0 verwenden sollte. continue ist der am schwierigsten beherrschbare Fall Sprüngen innerhalb von Schleifen; durch einfaches drehen der Bedingung verschwindet das continue. Du verwendest Python 2, dort ist print ein Statement und keine Funktion, die Klammern gehören also nicht da hin. Es gibt in Python vier verschiedene Arten von Anführungszeichen für Strings, so dass das escapen von ' oder " meist überflüssig ist (bei Dir ja auch schon durch die Wahl der Anführungszeichen gegeben).
Da get_eingabe sowieso nur ja oder nein zuläßt, könnte man gleich einen boolschen Wert zurückgeben.
Alles was unter 'if __name__ == "__main__":' steht, sollte in eine main-Funktion wandern.
Der Backslash als Zeilenfortsetzungszeichen sollte vermieden werden, da Backslash + Leerzeichen visuell nicht zu unterscheiden ist, aber zu einem Fehler führt. Normalerweise macht man das durch Klammern, hier reicht einfach, den String in mehrere prints aufzuspalten.
Nach : sollte immer eine neue Zeile anfangen. Für die 'farbe =' Zuweisungen böte sich auch gleich der Bedingungsoperator 'x if a else y' an.
Neben farbe solltest Du auch noch eine Variable wert einführen, so dass das print nur am Ende nötig ist. Statt Strings mit + zusammenzustückeln solltest Du .format verwenden. Statt die Bedingungen und ihre Negierung ständig zu wiederholen, bietet sich eine weitere Verschachtelungsebene und else an.
Alles in allem komme ich bei sowas raus:

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-

def get_eingabe(anzeige):
    while True:
        eingabe = raw_input('{} >>> '.format(anzeige)).lower()
        if eingabe in ('j', 'n'):
            return eingabe == 'j'
        print "Beantworten Sie Fragen bitte nur mit 'j' fuer ja und 'n' für nein"

def main():
    print "Es stehen die 32 Spielkarten mit den vier Zahlen-Werten"
    print "  'Sieben' - 'Acht'- 'Neun' und 'Zehn', den vier Bild-Werten"
    print "  'Bube' - 'Dame' - 'König' und 'Ass' in den vier Farben"
    print "  'Kreuz' - 'Pik' - 'Karo' und 'Herz' zur Auswahl."
    print "Merke Dir bitte eine dieser Karten und"
    print "beantworte meine Fragen bitte nur mit 'j' fuer ja und 'n' für nein"

    eingabe = get_eingabe('Hat die Karte eine schwarze Farbe (Kreuz oder Pik)?')
    if eingabe:
        eingabe = get_eingabe('Ist es eine Pik-Karte?')
        farbe = 'Pik' if eingabe else 'Kreuz'
    else:
        eingabe = get_eingabe('Ist es eine Herz-Karte?')
        farbe = 'Herz' if eingabe else 'Karo'

    zahl = get_eingabe('Ist es eine Karte mit einem Zahlenwert?')
    if zahl:
        gerade = get_eingabe('Ist es eine gerade Zahl?')
        kleiner9 = get_eingabe('Ist die Zahl kleiner 9?')
        if kleiner9:
            wert = 'Acht' if gerade else 'Sieben'
        else:
            wert = 'Zehn' if gerade else 'Neun'
    else:
        herren = get_eingabe('Ist es eine Karte mit einem Herren (Bube oder König)?')
        groesser_dame = get_eingabe('Ist der Wert der Karte größer als der einer Dame?')
        if groesser_dame:
            wert = 'König' if herren else 'Ass'
        else:
            wert = 'Bube' if herren else 'Dame'
    print('Dann hast Du Dir die {} {} gemerkt.'.format(farbe, wert))

if __name__ == "__main__":
    main()
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Auf eine Ja/Nein Frage mit Nein antworten, sollte vielleicht nicht als Ja interpretiert werden ;)
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@DasIch: :?:
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @Sirius3:

Mit "True" Als Wahrheitswert hast Du Recht und ich praktiziere das auch so. Allerdings im konkreten Fall, ich hatt für die Bedingung der while-Schleife "True" gesetzt, wurde mir für genau diese Zeile ein Fehler gemeldet. Daraufhin setzte ich die "1" und diese wurde akzeptiert. Meiner Erinnerung nach hatte ich aber auch noch irgend etwas anderes verändert. Aber nun stand da die "1", es funktionierte und so blieb sie dann auch stehen.

Auch mit "continue" will ich Dir nicht wiedersprechen, auch wenn ich in wesentlich größeren Programmen, nicht unter Python, bisher diese Anweisung schon sehr oft verwendet habe, ohne damit auch nur einmal ein Problem zu haben. Trotzdem, danke für die Anregung.

Das Klammern der Argumente für Print ist falsch, wie Dur richtig feststellst. Da ging es mir auch einmal so ähnlich wie mit dem vorstehend erwähnten Wahrheitswerten, mit Klammern funktionierte es, ohne nicht. Aber auch hier gab es dafür sicher eine andere Begründung, als die Klammern. Jedenfalls setzte ich von da an mal Klammern und mal nicht. Jetzt weiß ich Bescheid, dass sie definitiv nicht gesetzt werden sollen.

Das Escapen von Anführungszeichen hätte ich mir auch ersparen können. Es ensprang wohl einer alten Gewohnheit. Allerdings fallen mir im Augenblick nur drei verschiedene Anführungszeichen ein, die einfachen, die doppelten und die dreifachen. Du sprichst von vier.

Ja, da get_eingabe sowieso nur ja oder nein zuläßt, hätte ich besser einen boolschen Wert zurück gegeben. Dies habe ich bewusst unterlassen, um den Anfänger, für den es ja gedacht ist, nicht unnötig zu verwirren.

Zu Deiner Aussage, dass alles was unter 'if __name__ == "__main__":' steht, in eine main-Funktion wandern sollte, habe ich eine Frage: Wie wichtig ist dieses Konstrukt unter Python überhaupt. Mir sind schon eine Reihe von Beispielen aufgefallen, in denen darauf verzichtet wurde. Aber ich weiß jetzt Bescheid und werde mich dann auch daran halten.

Ebenso werde ich aus dem von Dir genannten Grund in Zukunft auf den Backslash als Zeilenfortsetzungszeichen verzichten und auch die übrigen Empfehlungen beherzigen. Mit Python befasse ich mich ja erst seit ganz kurzer Zeit und bin daher noch nicht so festgefahren.

Auf jeden Fall gefällt mir Dein Code doch noch ein Stück besser als der meine und er ist auch noch kürzer geworden.

Nochmals vielen Dank für Deine für mich wertvollen Hinweise.

MfG, kodela
BlackJack

@kodela: Die dreifachen Anführungszeichen gibt's ja in zwei Varianten: Mit einfachen und mit doppelten Anführungszeichen. Das sind dann insgesamt vier Varianten.

Wenn man das Hauptprogramm auf Modulebene schreibt und nicht in eine Funktion steckt, dann hat man an der Stelle wieder Modulglobale Variablen und läuft gefahr das die absichtlich oder aus versegen in Funktionen oder Methoden in dem Modul verwendet werden. Also ohne das sie als Argumente dort reingehen.

Das ``if __name__ == '__main__':`` ist wichtig damit man das Modul importieren kann ohne dass gleich das Hauptprogramm losläuft. Das braucht man wenn man das Modul ”live” oder automatisiert testen möchte, und es gibt auch diverse Werkzeuge die erwarten das man Module ohne so einen gravierenden Effekt importieren kann. Beispielsweise um Dokumentation aus dem Modul zu extrahieren.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @BlackJack:

Danke für Deine Aufklärung. Das "Zehnerl" ist gefallen, ob es aber schon ganz unten angekommen ist, da bin ich mir nicht so ganz sicher.

Das mit den einfachen und doppelten dreifachen Anführungszeichen hatte ich schon einmal irgend wo gelesen, aber was hab' ich in den letzten Wochen nicht alles allein zum Thema Python gelesen. Da ist nicht alles wirklich hängen geblieben, das einfache dreifache Anführungszeichen gehört dazu.

Die Bedeutung einer Main-Funktion leuchtet ein, vor allen Dingen dann, wenn es sich nicht um so kleine "Spaßprogramme" handelt, wie hier das "Spielkarte raten". Bei etwas anspruchvolleren Programmen ist allein schon wegen der von Dir angesprochenen Problematik mit dem Sichtbereich von Variablen eine vernünftige Strukturierung erforderlich. Da kann man den Code nicht so einfach in die Luft hängen.

Was mir noch nicht so ganz klar ist: In der Abfrage if __name__ == "__main__": wird zum Beispiel in dem hier von Sirius3 und mir geposteten Code davon ausgegangen, dass die Bedingung erfüllt ist, dass also irgend wo eine Variable __name__ definiert ist, welcher der Wert "__main__" zugewiesen wurde. Wo bitte ist dies der Fall?

MfG, kodela
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

`__name__` kommt wie die meisten dunder (Double UNDERscore) Namen vom Interpreter selbst: https://docs.python.org/2/tutorial/modules.html
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @Sirius3:

Dein Vorschlag, alle Print-Ausgaben zusammen zu fassen bedingt eine Textänderung. Eine solche wollte ich nicht und daher keine Zusammenfassung.

Die Zeile:

Code: Alles auswählen

print('Dann hast Du Dir die {} {} gemerkt.'.format(farbe, wert))
führt zum Beispiel zu folgender Ausgabe: "Dann hast Du Dir die Kreuz Bube gemerkt.", oder "... die Herz König ...".

Man könnte natürlich auf den Artikel verzichten oder über einen "Bauchaufschwung" doch noch den richtigen ausgeben. Die individuelle Ausgabe habe ich allerdings als die einfachere Lösung angesehen.

Man kann aber aus den acht Print-Ausgaben durch eine Zusammenfassung zwei machen, wobei der richtige Artikel verwendet wird. Man braucht nur für die "Herren eine extra Wurst zu braten".

MfG, kodela
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@kodela: es ist immer gut, die Ausgabe von der Verarbeitung zu trennen. Das ist bei den konditionalen Eingaben schwierig, aber für die Ausgabe relativ einfach, in dem man eben nur ein print hat. Da der Artikel eindeutig vom Wert abhängt, läßt sich das Problem über ein einfaches Mapping lösen - Du hast das Ass vergessen.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @Sirius3,

ja, ich sehe das auch so, die Ausgabe sollte von der Verarbeitung getrennt werden. Das habe ich in dem Beispiel nicht gemacht. Asche auf mein Haupt. Spaß beiseite, eine Frage: Inwiefern habe ich die Ass vergessen? Sie ist doch berücksichtigt (Zeilen 55 und 56).

MfG, kodela
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @cofi, hallo @Sirius3,

Hm - danke für die Hinweise. Rechtschreiben 5, setzen!

MfG, kodela
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo Sirius3
Sirius3 hat geschrieben:@kodela: ... Du verwendest Python 2, dort ist print ein Statement und keine Funktion, die Klammern gehören also nicht da hin.
Ich muss noch einmal auf Deine Aussage zu meinem Code für das Spielkarte raten Problem zurück kommen.

In der Dokumentation zu Python 2.7 ist print sehr wohl als Funktion aufgeführt. Daneben kann print auch als Anweisung verwendet werden. Die Ergebnisse sind übrigens nicht immer identisch. Oder sehe ich da etwas falsch?

MfG, kodela
Antworten