Seite 1 von 1

Fehler im Code

Verfasst: Mittwoch 2. März 2016, 18:51
von GabbaGandalf

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

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 19:00
von 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.

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 19:04
von GabbaGandalf
Ich dachte die Eingabe wird automatisch als Zahl gespeichert in result. Wie würde die Bedingung richtig aussehen?

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 20:08
von Sirius3
@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.

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 20:56
von /me
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.

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 21:12
von GabbaGandalf

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?

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 21:39
von 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.

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 21:42
von /me
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.

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 22:42
von GabbaGandalf
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.

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 23:07
von GabbaGandalf
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

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 23:14
von miracle173
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!"   

Re: Fehler im Code

Verfasst: Mittwoch 2. März 2016, 23:18
von darktrym
Und was macht das i da?

EDIT: zu langsam

Re: Fehler im Code

Verfasst: Donnerstag 3. März 2016, 00:19
von 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.

Re: Fehler im Code

Verfasst: Donnerstag 3. März 2016, 08:43
von /me
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.

Re: Fehler im Code

Verfasst: Donnerstag 3. März 2016, 16:05
von GabbaGandalf
@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.