Rechenfehler: ValueError: invalid literal for int()

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.
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

Rechenfehler: ValueError: invalid literal for int()

Beitragvon Krauzi » Samstag 27. September 2008, 12:31

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)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Beitragvon sma » Samstag 27. September 2008, 12:38

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
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

Beitragvon Krauzi » Samstag 27. September 2008, 12:42

sma hat geschrieben:Dein Code ist übrigens recht weit von üblichem Python-Stil entfernt.


Inwiefern?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Samstag 27. September 2008, 12:46

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Samstag 27. September 2008, 12:56

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?
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

Beitragvon Krauzi » Samstag 27. September 2008, 13:05

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 :(
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Samstag 27. September 2008, 13:52

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.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Samstag 27. September 2008, 14:41

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]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Samstag 27. September 2008, 17:48

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 :)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]