Fehler im Code

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
GabbaGandalf
User
Beiträge: 8
Registriert: Mittwoch 2. März 2016, 18:43

Code: Alles auswählen

result = 0
while (result != 400):
    result = raw_input("420-20=? \n=")
   
    print ("Wrong Answer!")
   
else:
    print("You finally got the right answer") 

Hallo Leute,

ich wollte mir einen Raspberry Pi zulegen, deswegen wollte ich mir erstmal ein großes Basiswissen von Python aneignen. Oben seht ihr meinen Quellcode. Ich habe probiert so gut wie es geht eine Do-While schleife zu implementieren. ( Hab ein bisschen Basiswissen in C++).
Könnt ihr mir sagen wieso die while Schleife weiter geht auch wenn man das richtige Ergebniss eingibt? :K

Danke schon mal :D
Zuletzt geändert von Anonymous am Mittwoch 2. März 2016, 18:55, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

@GabbaGandalf: Du vergleichst eine Zeichenkette mit einer Zahl, das ist *immer* ungleich. Du musst die Eingabe entweder in eine Zahl umwandeln oder mit einer Zeichenkette vergleichen.

eine DO-WHILE-Schleife gibt es syntaktisch in Python nicht, die wird üblicherweise durch eine ”Endlosschleife” (``while True:``) und einem bedingten Schleifenabbruch in der Schleife (``if``/``break``) ausgedrückt. Dann braucht man vor der Schleife keinen Namen an einen unsinnigen Wert zu binden.

Schleifen können zwar einen ``else``-Zweig haben, der macht aber keinen Sinn wenn in der Schleife kein ``break`` verwendet wird.

Um die Bedingung bei ``while`` gehören keine klammern und um das ”Argument” bei der ``print``-Anweisung auch nicht.
GabbaGandalf
User
Beiträge: 8
Registriert: Mittwoch 2. März 2016, 18:43

Ich dachte die Eingabe wird automatisch als Zahl gespeichert in result. Wie würde die Bedingung richtig aussehen?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@GabbaGandalf: da dachtest Du eben falsch. Statt denken kann man auch die Dokumentation lesen. Du könntest, wie BlackJack schon geschrieben hat, mit "400" vergleichen, oder die int-Funktion benutzen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

GabbaGandalf hat geschrieben:Ich dachte die Eingabe wird automatisch als Zahl gespeichert in result. Wie würde die Bedingung richtig aussehen?
Aber nicht doch. Es wäre schlimm, wenn Python versuchen würde zu raten, was für einen Datentyp es zurückgeben soll. raw_input liefert immer einen String. Der kann dann mit Funktionen wie int in eine Zahl überführt werden.
GabbaGandalf
User
Beiträge: 8
Registriert: Mittwoch 2. März 2016, 18:43

Code: Alles auswählen

´
answ = raw_input("420-20=? \n=")

result = int(answ)

while result != 400:
    answ = raw_input("420-20=? \n=")
    
    result = int(answ)
   
    print "Wrong answer!"
   
else:
    print"You finally got the right answer."
So danke mit den Tipps hab ich es geschafft. Das ist meine Lösung. Geht es noch effizienter?
BlackJack

@GabbaGandalf: Ja, in dem man eine ”Endlosschleife” schreibt wie ich ja schon beschrieben habe. Dann braucht man keinen Code und keine Daten wiederholen, was das DRY-Prinzip („Don't Repeat Yourself“) verletzt, und damit zu potentiellen Fehlerquellen führt.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

GabbaGandalf hat geschrieben:So danke mit den Tipps hab ich es geschafft. Das ist meine Lösung. Geht es noch effizienter?
Statt zwei Zeilen zu verwenden könntest du das auch zusammenfassen.

Code: Alles auswählen

result = int(raw_input("420-20=? \n="))
Spannend wird es aber grundsätzlich dann, wenn du einen Wert eingibst der sich nicht in ein Integer-Zahl konvertieren lässt. Das ist dann der Zeitpunkt wo man sich vorzugsweise eine eigene Funktion für die Werteeingabe schreibt. Der Code wird dadurch zwar länger, aber robuster.
GabbaGandalf
User
Beiträge: 8
Registriert: Mittwoch 2. März 2016, 18:43

Warum sollte der String nicht in einen Integer umgewandelt werden. Weil die Zahl zu groß ist oder es eine Kommastelle hat? Aber dann könnte man ja den String in einen float umwandeln.
GabbaGandalf
User
Beiträge: 8
Registriert: Mittwoch 2. März 2016, 18:43

Ich habe noch eine andere Möglichkeit gefunden die while schleife funktionieren zu lassen in dem ich die Bedingung mit zwei Strings mache. Eigentlich logisch und einfach ^^ . Habe außerdem noch ein Zähler integriert.

Code: Alles auswählen

answ = raw_input("420-20=? \n=")
i= 1

while answ != "400":
    print "Wrong answer!\n\n"

    answ = raw_input("420-20=? \n")
    
       i += 1
       
else:
    print"You finally got the right answer.\nIt only took you %d tries." %i
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

GabbaGandalf hat geschrieben:

Code: Alles auswählen

´
answ = raw_input("420-20=? \n=")

result = int(answ)

while result != 400:
    answ = raw_input("420-20=? \n=")
    
    result = int(answ)
   
    print "Wrong answer!"
   
else:
    print"You finally got the right answer."
So danke mit den Tipps hab ich es geschafft. Das ist meine Lösung. Geht es noch effizienter?
  1. Erst testen, dann posten. Du druckst immer zuerst einmal "Wrong answer" nach einer Eingabe aus, das ist wohl nicht richtig.
  2. Code in der Schleife steh noch einmal außerhalb der Schleife. Solch ein Verdoppeln sollte man vermeiden
  3. den Input in Integer umzuwandeln is weniger gut. Wenn der Benutzer keine Ziffernkette eingibt, kommt es zu einer Exception mit Programmabbruch.
Also besser:

Code: Alles auswählen

´
while True:
    answ = raw_input("420-20=? \n=")
    if answ=='400':
        print "You finally got the right answer."
        break
    else:
         print "Wrong answer!"   
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Und was macht das i da?

EDIT: zu langsam
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@GabbaGandalf: Benutzer geben auch gerne mal ``asdfg`` oder irgendwas anderes ein, auch wenn explizit nach einer Zahl gefragt wurde. Selbst Benutzer die eigentlich eine Zahl eingeben wollen, können mal eine falsche Taste drücken. Ein robustes Programm kommt auch damit klar.

Wenn Du die Eingabe nicht umwandelst und mit einer Zeichenkette vergleichst, umgehst Du dieses Problem zwar, aber ich würde das eher als Hack ansehen wenn der Wert eigentlich eine Zahl sein sollte.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

GabbaGandalf hat geschrieben:Warum sollte der String nicht in einen Integer umgewandelt werden.
Würdest du wirklich von einer Eingabefunktion erwarten, dass sie den eingegebenen Text analysiert und dann das Ergebnis anhand eines internen Regelwerks in einen anderen Datentyp konvertiert? Was ist denn, wenn dein Code die Eingabe auf jeden Fall als String erwartet? Wenn ich 9X8 eingebe bekomme ich einen String als Datentyp, wenn ich hingegen 321 eingebe bekomme ich einen Integer-Wert obwohl ich einen String brauche? Und was ist mit Werten wie 0o10 (Null - Buchstabe o - eins - null). Soll Python da einen String zurückgeben oder aufgrund der Oktaldarstellung den Integer-Wert 8?

Statt Python da anhand eines komplexen Regelwerks raten zu lassen ist der einheitliche Ansatz deutlich besser. Der Entwickler weiß was er als Rückgabe zu erwarten hat und kann dann selber bei Bedarf eine Typumwandlung vornehmen.
GabbaGandalf
User
Beiträge: 8
Registriert: Mittwoch 2. März 2016, 18:43

@me
Danke für die ausführliche Erklärung ergibt Sinn das es als String ausgegeben wird. Hab mir auch die Funktion der while True: schleife angeschaut, die scheint hier dir beste Lösung zu bieten.
Antworten