Verständnisprobleme

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
Hisss
User
Beiträge: 2
Registriert: Sonntag 29. Juli 2018, 13:35

Aloah!

Ich bin neu. Sowohl hier im Forum, als auch in der Welt von Python. Ich lerne nach einem Buch und habe mein erstes Quiz erstellt, aber eine winzige Kleinigkeit verstehe ich nicht.

(Eine Spoiler Funktion wäre gut!)

def pruef_rate(rate, antwort):
global punkte
noch_rate = True
versuch = 0
while noch_rate and versuch < 3:
if rate.lower() == antwort.lower():
print('Richtige Antwort.')
punkte = punkte + 1
noch_rate = False
else:
if versuch < 2:
rate = input('Falsch. Versuch\'s ermeut!')
versuch = versuch + 1
if versuch == 3:
print('Die richtige Antwort ist ' + antwort)

punkte = 0
print('Rate das Tier!')
rate1 = input('Welcher Bär lebt am Nordpol?')
pruef_rate(rate1, 'Eisbär')

rate2 = input('Was ist das schnellste Landtier?')
pruef_rate(rate2, 'Gepard')

rate3 = input('Was ist das größte Tier?')
pruef_rate(rate3, 'Blauwal')

print('Du hast ' + str(punkte) + ' Punkte.')

Ich verstehe den Wert "rateX" nicht. Der Befehl pruef_rate führt das Skript zur ersten Zeile. Hier habe ich aber den Wert "rate" und nicht "rate1". Ich verstehe den Wert "rate" innerhalb des ersten Blocks ja, weil er mit dem Befehl "rate=input..." zum Prüfwert wird, welcher mit der richitgen Antwort geprüft wird. Aber die richtige Antwort in der ersten Frage wird ja mit "rate1" verglichen und nicht mit "rate". Oder wird "rate1" in der ersten Zeile in "rate" verwandelt?

------------------------------------------------------------------

Und hier gleich eine zweite Frage:

alter = input('Wie alte bist du?')
x = '7'
if alter > x:
print('Du bist älter als 7.')
if alter < x:
print('Du bist jünger als 7.')
if alter == x:
print('Du bist genau 7.')


Wenn ich die Zahlen 0-6 eingebe kommt die richitge Antwort, bei 7 auch und bei 8-9 ebenfalls. Allerdings kommt bei der Eingabe von Buchstaben die Antwort ich sei älter als 7 und wenn ich eine größere Zahl als 9 eingebe, wird wird nur die erste Zahl gewertet. Also die Antwort 23 wird als 2 und die Antwort 89 als 8 gewertet. Wo ist der Fehler?
Benutzeravatar
noisefloor
User
Beiträge: 4209
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das 1. Argument der `pruef_rate` heißt halt `rate`. Wie die Variable beim Funktionsaufruf heißt, ist egal. In `pruef_rate` heißt die `rate`, das ist alles.

Ansonsten ist der Code nicht gut... Ein paar Punkte: stärker modularisieren, d.h. mehr Funktionen. Wenn du Variablen (rate1, rate 2, ...) nummerierst ist das immer ein Zeichen, dass du eigentlich eine Liste nutzen willst. `global` sollte generell nicht verwendet werden, weil es den Zustand des Programms schwerer nachvollziehbar macht. Am besten vergessen, dass es `global` gibt.

Und das nächste Mal bitte den Code in einen Code-Block setzen, damit dieser besser lesbar ist. Bei dir fehlen so auch alle Einrückungen.

Gruß, noisefloor
Hisss
User
Beiträge: 2
Registriert: Sonntag 29. Juli 2018, 13:35

Danke für die Antwort. Der Codeblock besteht ja, nur beim hier rein kopieren wurde das in dieses blöde Format geändert. Dass mein Code nicht optimal ist weiß ich selber, aber ich lerne von diesem Buch hier. Da das meine allerersten Schirtte überhaupt im Thema Programmierung sind, mache ich alles so wie es in diesem Buch steht. Die Feinheiten kommen sicher noch, bin ja erst bei Seite 42. ^^

Edit: Alles klar, hab jetzt die rate[Zahl] in nur rate geändert. Macht keinen Unterschied. Also ist die Zahl nur zur Kennzeichnung der Anzahl da, aber für den Code nutzlos. Danke für die Hilfe. Bleibt nur noch das Problem mit dem zweiten Beispiel.
Benutzeravatar
__blackjack__
User
Beiträge: 14135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hisss: Mit Codeblock sind die Code bzw. Python-Tags hier im Forum gemeint, damit die Einrückung hier auch richtig angezeigt wird. Im vollständigen Editor einfach mal auf die Schaltfläche „Python“ drücken.

Beim zweiten Beispiel vergleichst Du keine Zahlen sondern Zeichenketten. Und da ist beispielsweise '10' kleiner als '2' weil '1' kleiner als '2' ist.

Code: Alles auswählen

In [15]: '10' < '2'
Out[15]: True

In [16]: 10 < 2
Out[16]: False
Zeichenketten werden Zeichen für Zeichen verglichen bis ein Zeichen kleiner als das andere ist. Falls alle Zeichen gleich sind bis eine der beiden Zeichenketten zu ende ist, dann ist dir kürzere Zeichenkette die kleinere.

Man sollte also immer mit den Datentypen arbeiten, die die Werte auch logisch haben. Und nicht mit Zeichenkettendarstellungen von Werten die eigentlich eine speziellere Bedeutung haben.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

`global` zu benutzen, ist wirklich ein Fehler. Sollte das so im Buch vorkommen, dann lernst Du etwas, wie man es nicht machen sollte. `pruef_rate` macht auch zu viel. Es prüft ja nicht nur auf die richtige Antwort, sondern frag auch erneut nach. Besser wäre es daher, auch das erste Fragen in die Funktion zu schreiben. Statt eines Flags zum Abbruch der while-Schleife nimmt man besser »break«, dann kann man das Zählen der Versuche durch eine for-Schleife ausdrücken. Statt das einfache Anführungszeichen in »Versuch's« zu escapen, nimm doppelte zum Einfassen des Strings. Strings setzt man nicht mit + zusammen, sondern nimmt format.

Code: Alles auswählen

def stelle_frage(frage, antwort):
    prompt = frage
    for versuch in range(3):
        eingabe = input(prompt)
        if eingabe.lower() == antwort.lower():
            print('Richtige Antwort.')
            return True
        prompt = "Falsch. Versuch's erneut!"
    print('Die richtige Antwort ist {}.'.format(antwort))
    return False

punkte = 0
print('Rate das Tier!')
if stelle_frage('Welcher Bär lebt am Nordpol?', 'Eisbär'):
    punkte += 1
if stelle_frage('Was ist das schnellste Landtier?', 'Gepard'):
    punkte += 1
if stelle_frage('Was ist das größte Tier?', 'Blauwal'):
    punkte += 1
print('Du hast {} Punkte.'.format(punkte))
Da hier »stelle_frage« drei mal fast identisch vorkommt, kann man Frage und Antwort noch in eine Liste packen:

Code: Alles auswählen

FRAGEN = [
    ('Welcher Bär lebt am Nordpol?', 'Eisbär'),
    ('Was ist das schnellste Landtier?', 'Gepard'),
    ('Was ist das größte Tier?', 'Blauwal'),
]
punkte = 0
print('Rate das Tier!')
for frage, antwort in FRAGEN:
    if stelle_frage(frage, antwort):
        punkte += 1
print('Du hast {} Punkte.'.format(punkte))
Benutzeravatar
noisefloor
User
Beiträge: 4209
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

habe mir gerade mal die Leseprobe des Buchs angeschaut: Das Listing aus dem Eingangspost ist 1:1 übernommen, inkl. `global`.

@Hisss: mit dem Buch lernst du Python bestenfalls suboptimal, die 16,95 Euro sind leider schlecht investiert. Leg' das Buch am besten weg und arbeite das offizielle Python-Tutorial durch. Da hast du ziemlich sicher mehr von.

Gruß, noisefloor
Antworten