Anfänger kann Fehler nicht ermitteln -Python 3.6.5

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
peoplez
User
Beiträge: 8
Registriert: Donnerstag 2. August 2018, 17:08

Hallo zusammen,
ich bin noch ein absoluter Anfänger und lerne derzeit mit Hilfe eines Buches.
Nun gab es im Buch ein Beispielcode, den ich abgetippt habe um selbst zu testen, was sich durch meine nachträglichen Eingaben verändert.
Leider zeigt er mir immer einen Fehler bei "continue" an (not properly in loop).

Ich habe den Code jetzt gefühlte 3 Stunden immer wieder mit dem Buch abgeglichen und konnte keine Abweichung feststellen. Ich hoffe jemand kann mir hier weiterhelfen :-/


Hier der Code:

Code: Alles auswählen

import random
random.seed()

a = random.randint(1,100)
b = random.randint(1,100)
c = a + b

print("Die Aufgabe lautet:", a, "+", b)

zahl = c + 1
versuch = 0

while zahl != c:
    versuch = versuch + 1


print("Bitte eine ganze Zahl eingeben")
z = input()


try:
    zahl = int(z)

except:
    print("Sie haben keine ganze Zahl eingegeben")
    continue

   
   
if zahl == c:
    print(zahl, "ist richtig!")
  
else:
    print(zahl, "ist falsch!")

        


print("Ergebnis:", c)
print("Anzahl der Versuche:", versuch)

würde mich echt freuen wenn jemand das Problem erkennt.

Mit freundlichen Grüßen
peoplez
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

'continue' kann nur innerhalb einer Schleife verwendet werden -- und bei dir steht es außerhalb. Der Körper einer Schleife wird eine Ebene eingerückt und in deinem Beispiel ist ein größerer Abschnitt der eigentlich in die Schleife gehört nicht richtig eingerückt. Wahrscheinlich hast du beim Abtippen die Einrückung nicht exakt eingehalten. Prüf das bitte noch mal (oder eigne dir an, wie die Einrückregeln für Python sind und versuch es selbst; das musst du eh lernen.)
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi peoplez

Wie es nezzcarth schon angedeutet liegt ein Einrückungs Fehler vor:

Code: Alles auswählen

import random
random.seed()

a = random.randint(1,100)
b = random.randint(1,100)
c = a + b

print("Die Aufgabe lautet:", a, "+", b)

zahl = c + 1
versuch = 0

while zahl != c:
    versuch = versuch + 1


    print("Bitte eine ganze Zahl eingeben")
    z = input()


    try:
        zahl = int(z)

    except:
        print("Sie haben keine ganze Zahl eingegeben")
        continue

       
       
    if zahl == c:
        print(zahl, "ist richtig!")
      
    else:
        print(zahl, "ist falsch!")

            


    print("Ergebnis:", c)
    print("Anzahl der Versuche:", versuch)
Gruss wuf ;-)
Take it easy Mates!
peoplez
User
Beiträge: 8
Registriert: Donnerstag 2. August 2018, 17:08

Hallo nezzcarth und wuf,
vielen Dank für eure Antworten, jetzt ergibt auch alles irgendwie einen Sinn für mich. Habe das ja 1:1 aus dem Buch getippt und mich beim tippen schon gewundert warum das so seltsam aussieht.
Jetzt erkennt man ja, dass alles unter "while" zur Schleife gehört. Vielen Dank euch beiden für den Hinweis :-)

Mit freundlichen Grüßen
peoplez
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@wuf: die letzten beiden Zeilen sind falsch eingerückt.

Hallo peoplez,
da der Code aus einem Buch stammt, kann man ihn nicht so stehen lassen. Der Code ist ob der vielen Leerzeilen sehr schwer lesbar. Leerzeilen sollte man sparsam einsetzen, sonst verlieren sie ihre Wirkung. `random.seed` ist hier unnötig und reduziert im Zweifel sogar die Zufälligkeit.

In Zeile 10 wird `zahl` mit einem Dummywert belegt, nur damit die while-Schleife startet. Das ist ein Zeichen, dass man eigentlich eine deren Bedingung am Ende und nicht am Anfang steht. Die Lösung ist eine Endlosschleife (while True:), die bei einer Bedingung per `break` verlassen wird. Hier hast Du noch zusätzlich einen Zahler `versuche`, wofür man eine for-Schleife einsetzen könnte.

Niemals nackte `except`s benutzen, weil die auch viele Programmierfehler und Fehler, die man gerne anders Verarbeiten will (z.B. KeyboardInterrupt) abfangen. Hier darf man nur den ValueError abfangen, der bei einer Umwandlung in eine Zahl auftritt, wenn keine Zahl eingegeben wurde.

`continue` sollte man sparsam einsetzen, weil es den Programmfluß undurchsichtig macht. Hier hülfe ein else-Block.

Code: Alles auswählen

from itertools import count
import random

a = random.randint(1,100)
b = random.randint(1,100)
c = a + b

print("Die Aufgabe lautet:", a, "+", b)
for versuche in count(1):
    eingabe = input("Bitte eine ganze Zahl eingeben:")
    try:
        zahl = int(eingabe)
    except:
        print("Sie haben keine ganze Zahl eingegeben")
    else:
        if zahl == c:
            print(zahl, "ist richtig!")
            break
        print(zahl, "ist falsch!")

print("Ergebnis:", c)
print("Anzahl der Versuche:", versuch)
peoplez
User
Beiträge: 8
Registriert: Donnerstag 2. August 2018, 17:08

Hallo Sirius3,
danke, dass auch du dir die Zeit genommen hast.

Bei deinem Code bekam ich nach der Eingabe des richtigen Ergebnises eine Fehlermeldung, lag aber nur an der Variable "versuche", die ganz unten nicht ausgegeben werden konnte, weil ein "e" fehlte :-). Aber du hast recht, dein Code sieht eleganter aus.

vielen Dank für deinen Beitrag!

Mit freundlichen Grüßen
peoplez
Antworten