Seite 1 von 1

Rechenfehler: ValueError: invalid literal for int()

Verfasst: Samstag 27. September 2008, 12:31
von Krauzi
Wenn ich als Rechenart für diesen Rechner alles auser + nehme, bekomm ich folgenden Fehler:
>>>
Bitte gebe die Rechnung ein: 5 * 6
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Krauzi\Desktop\rechner.py", line 45, in <module>
ZAHL1 = int(EINGABE[0])
ValueError: invalid literal for int() with base 10: '5 * 6'
>>>

Die Python-Datei:

Code: Alles auswählen

#Variablen
WIEDERHOLUNG = True

#Rechnen
def Rechne(Zahl1, Zahl2, Rechenart):
        if Rechenart == '+':
                Ergebnis = Zahl1 + Zahl2
        elif Rechenart == '-':
                Ergebnis = Zahl1 - Zahl2
        elif Rechenart == '*':
                Ergebnis = Zahl1 * Zahl2
        else:
                Ergebnis = Zahl1 / Zahl2
                
        return Ergebnis

#Eingabe und Eingabefilterung
while WIEDERHOLUNG:
        EINGABE = raw_input("Bitte gebe die Rechnung ein: ")
        if EINGABE.find('+'):
                EINGABE = EINGABE.split('+')
                RECHENART = '+'
                
        elif EINGABE.find('-') == 0:
                EINGABE = EINGABE.split('-')
                RECHENART = '-'
                
        elif EINGABE.find('*') == 0:
                EINGABE = EINGABE.split('*')
                RECHENART = '*'
                
        elif EINGABE.find('x') == 0:
                EINGABE = EINGABE.split('x')
                RECHENART = '*'
                
        elif EINGABE.find('/') == 0:
                EINGABE.split('/')
                RECHENART = '/'
                
        else:
                EINGABE.split(':')
                RECHENART = '/'
                          
        ZAHL1 = int(EINGABE[0])
        ZAHL2 = int(EINGABE[1])

        print "Das Ergebnis lautet:", Rechne(ZAHL1, ZAHL2, RECHENART)

Verfasst: Samstag 27. September 2008, 12:38
von sma
Ja und? Wenn du nur "+" zulässt, aber "*" benutzt, dann kann das doch nicht funktionieren?! Du solltest dann auch als Beispiel "5+6" probieren. Dein Code ist übrigens recht weit von üblichem Python-Stil entfernt.

Stefan

Verfasst: Samstag 27. September 2008, 12:42
von Krauzi
sma hat geschrieben:Dein Code ist übrigens recht weit von üblichem Python-Stil entfernt.
Inwiefern?

Verfasst: Samstag 27. September 2008, 12:46
von numerix
sma hat geschrieben:Ja und? Wenn du nur "+" zulässt, aber "*" benutzt, dann kann das doch nicht funktionieren?! Du solltest dann auch als Beispiel "5+6" probieren. Dein Code ist übrigens recht weit von üblichem Python-Stil entfernt.
Nicht nur vom üblichen Python-Stil - es ist überhaupt außerordentlich umständlich programmiert. Falls es keine Hausaufgabe ist, würde ich das Programm ganz lassen: Der interaktive Interpreter bringt die hier (noch nicht) implementierten Fähigkeiten doch schon mit.

@Krauzi: Denk noch mal über die Bedingungen in den Zeilen 24+k·4 nach.

Verfasst: Samstag 27. September 2008, 12:56
von numerix
Krauzi hat geschrieben:
sma hat geschrieben:Dein Code ist übrigens recht weit von üblichem Python-Stil entfernt.
Inwiefern?
Insofern als du dich z.B. kein bisschen um die üblichen Konventionen bei der Namensgebung kümmerst: Mal groß, mal klein, mal ganz in Großbuchstaben, wie es gerade gefällt.

Üblich ist: Alles klein, außer Klassen (mit Großbuchstaben anfangen) und Konstanten (alles groß).
Um zu prüfen, ob ein Zeichen in einer Zeichenkette enthalten ist, ist find() hier nicht der richtige Weg, weil du den Index ohnehin nicht verwendest. Stattdessen kannst du so prüfen:

Code: Alles auswählen

if "+" in eingabe:
    # Addition
Weiterhin empfiehlt es sich nicht, eingabe sowohl für die eigentliche Eingabe (Zeichenkette) als auch für die durch split() generierte Liste zu verwenden (außer Zeile 37 und 41, wo du es vergessen hast).

Und: Das Programm verlässt sich - wenn die noch vorhandenen Fehler ausgebügelt sind und es überhaupt einigermaßen funktioniert - darauf, dass der Anwender auf jeden Fall eines der benötigten Rechenzeichen eingibt. Ansonsten versuchst du mittels ":" zu trennen. Ist kein Doppelpunkt drin: Was dann?

Verfasst: Samstag 27. September 2008, 13:05
von Krauzi
erst mal danke für deine antwort. Die war schon recht hilfreich.
Wegen der variablen:
Ob ich die groß oder klein definiere ist doch vollkommen egal. Ich habe das nur vom definieren übernomen, wo ich gerne wörter durch große Anfangsbuchstaben trenne.

Ich frag mich nur, wieso ich so nen einfachen rechner nicht hinbekomme, wo ich schon weitaus kompliziertere programme gemacht habe (sowohl in c als auch in python). Ist wohl heute nicht mein tag :(

Verfasst: Samstag 27. September 2008, 13:52
von numerix
Krauzi hat geschrieben:Ob ich die groß oder klein definiere ist doch vollkommen egal.
Richtig. Jedenfalls, solange du der einzige bist, der sich den Quelltext ansehen muss. Wenn du möchtest, dass andere sich mit deinem Code beschäftigen, dann tust du gut daran, dich an die üblichen Konventionen zu halten.
Wenn du dich daran gewöhnt hast, fällt es dir auch leichter, andere Quelltexte zu verstehen, weil die Wahl der Schreibweise (abgesehen vom durch den Bezeichner transportierten Inhalt) Informationen über das Objekt enthält. Beispiel:

Code: Alles auswählen

_eingabe
eingabe
Eingabe
EINGABE
Jede dieser Schreibweisen hat per Konvention ihre eigene Bedeutung und wer sie kennt (und selbst nutzt) kann den Code besser verstehen.

Verfasst: Samstag 27. September 2008, 14:41
von cofi
Ist ja lustig. Da redest du ständig über die Konventionen und dann sagst du nicht wo es die zu finden gibt ;)

Offizielles PEP 8
[wiki=PEP_8_(Übersetzung)]Deutsche Übersetzung[/wiki]

Verfasst: Samstag 27. September 2008, 17:48
von numerix
cofi hat geschrieben:Ist ja lustig. Da redest du ständig über die Konventionen und dann sagst du nicht wo es die zu finden gibt ;)
Ja, das war Absicht. Ich hatte einen Moment darüber nachgedacht und dann befürchtet, dass ein Verweis auf PEP 8 evtl. nach hinten losgeht, weil das ja nicht gerade wenig ist, was da steht.

Aber jetzt ist es ja raus :)