ValueError: invalid literal for int() with base 10: 'beenden

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
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

Hi leute,

habe ein kleines problem mit meinem python-skript.
in meiner letzten schleife, in der eine "ungültige" eingabe abgefangen wird schreibt mir die shell immer die meldung

Traceback (most recent call last):
File "H:\Hausaufgabe 29.1.2008 test2.py", line 297, in <module>
if int(ende) in Ziffern:
ValueError: invalid literal for int() with base 10: 'beenden'

Ich lade noch meinen quelltext rein, aber es kommt eigtl nur auf die letzte while-schleife an, weil in der er fehler verursacht wird.

bitte um schnelle hilfe

mfg, lukas



Code ausgelagert: http://paste.pocoo.org/show/27485/



P.S: bin noch an den anfängen meiner lehrzeit mit python :wink:


EDIT by Gerold: Code ausgelagert
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

mir ist außerdem gerade aufgefallen, dass er die eingegebene ziffer aus der letzten schleife nicht als "auswahl" verwendet, bzw falls doch, dass es nichts bewirkt... er springt einfach nur zum anfang des menüs...

vllt hat jemand auch hierfür eine lösung

mfg, lukas
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Naja, schau doch mal:

Code: Alles auswählen

ende=raw_input(...)
if int(ende) in Ziffern:
    ...
elif ende=='beenden':
    ...
Wenn du fuer end was anderes als eine Zahl eingibst, was soll dann herauskommen, wenn du das in der if-Abfrage in einen Integer umzuwandeln versuchst? Nichts anderes sagt die Fehlermeldung.

Mach's doch so:

Code: Alles auswählen

while Auswahl not in Ziffern:
    try:
        ende=raw_input('Tippen Sie nun die Ziffer oder "beenden" ein: ')
        Auswahl=int(ende)
        beenden=0
        Menue=0
    except ValueError:
        Menue=2
        beenden=1
        print 'Vielen Dank für die Verwendung!'
        break

Noch ein paar Anmerkungen: Du hast in deinem Quellcode ziemlich viele Stellen, die annaehern gleich sind, die ganze Ausgabe des Menues z.B. Das kann man zu Funktionen zusammenfassen.

Verzichte besser auf Umlauge in Variablennamen, das kann ganz schoenen Aerger geben.

Benutze keine except ohne eine konkrete Ausnahme anzugeben. Sonst siehst du auch keine Fehlermeldungen, wenn du irgendwo einen Programmierfehler machst...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

danke rebecca,

habe jetzt allerdings immernoch das problem, dass ich über den try-teil die abgefangene eingabe trotzdem nicht so verarbeiten kann, dass direkt der menüpunkt der zugehörigen ziffer ausgewählt wird. selbst, wenn ich die punkte "beenden=0" und "menue=0" entferne, springt er bei zifferneingabe in das menü...wobei ich mich farge wieso das...ob er da einfach die anfngsschleife neu startet...(?) ich möchte das programm so verändern, dass ich bei der zifferneingabe unten durch den try direkt in den zugehörigen menüpunkt komme...so wie es jetzt ist, funktioniert es leider nicht.

mit den definitionen habe ich mir auch schon gedanken gemacht, da ich auch der auffassung war, dass es so zulange ist :)
werde mich darum aber erst kümmern, wenn ich dieses problem gelöst habe, da ich gerne zunächst eine funktionierende variante hätte ;)

mfg, lukas
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

hallo ;)

kann mir bitte mal jemand antworten?^^
ich komm immernoch nicht weiter...
BlackJack

Also mir ist das zu gross, zu verschachtelt und zu viel globaler Zustand um mich damit auseinander zu setzen. Sorry.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Evil4President!

Das liegt wahrscheinlich daran, dass du deinen Code zu wenig strukturiert hast. Du könntest viel in Funktionen auslagern um das Programm durchsichtiger zu machen.

Aber so wie es im Moment ist, erinnert mich dein Programm eher an alte BASIC-Programme in denen jemand zwanghaft GOTO und GOSUB vermieden hat. Sorry, aber ich mache mir nicht die Mühe, dein Programm zu entwirren.

mfg
Gerold
:-)


PS: beim Auslagern deines Codes ist mir aufgefallen, dass du Umlaute in Variablenamen verwendest -- bitte tu das nicht.

Weiters benutzt du Umlaute in den Texten, ohne ein Encoding-Cookie angegeben zu haben. Bitte lies dir diesen Beitrag durch, dann weißt du von was ich schreibe: http://www.python-forum.de/topic-5095.html

Noch etwas. Du fängst teilweise ALLE Fehler eines Abschnittes ab, anstatt nur spezielle Fehler abzufangen. So kann es sein, dass du unerwartete Fehler nicht entdeckst.
So:

Code: Alles auswählen

try:
    ...
except ValueError:
    ...
Nicht so:

Code: Alles auswählen

try:
    ...
except:
    ...
.
Zuletzt geändert von gerold am Mittwoch 13. Februar 2008, 16:48, insgesamt 2-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

schade, aber im prinzip müsstest du dir nur die allerletzte schleife un den anfang ansehen, mittendrin die ganzen schleifen sind für das problem vollkommen unwichtig...da spielt nur die variable "auswahl" eine rolle, und um das problem gehts ja...nur du musst dir nicht die ganzen schleifen anschaun, weil die schleifen funktionieren, er springt nur aus der unterschen schleife bei eingabe der ziffer für eine andere schleife nichgt in die richtige schleife, sondern beginnt das prog. einfach nur von vorne...
für den verschachtelten und großen text muss ich mich entschuldigen, muss das noch zwecks schleifen-definition überarbeiten.

mfg
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

danke gerold...
werde das mit umlauten korrigieren und versuchen die schleifen in definitionen zu binden, damit es nichtmehr so viel ist und ihr es euch anschauen könnt. ;)
Balgofil
User
Beiträge: 2
Registriert: Samstag 15. September 2007, 18:52
Wohnort: Berlin

Werd jetzt mal wieder mein Senf dazu geben. Du kommst nicht in die Schleifen rein, weil Auswahl kein Integer ist. Somit muss dann dein Code folgendermaßen aussehen (mal sehen ob ich das mit den Python-Tags hin bekomme)

Code: Alles auswählen

...
try:
    Auswahl=int(raw_input("bla"))
except ValueError:
    Auswahl=0
...
Alternativ kannst du die Abfragen Auswahl==... mit Strings machen. Musst dann natürlich Ziffern (Liste) ändern.
Was mir noch aufgefallen ist, ist dass du möglich (also die Liste) ständig gleich definierst. Das kannst du aus den ganzen Schleifen raus ziehen. Und dann kann ich meinen Vorrednern nur beipflichten, schreib das ganze in Funktionen. Bei den if-Bedingungen mit stop kannste bei der letzten Bedingung else benutzen (ist halt kürzer :D ). Ach so und die ganzen prints sind einfach nur scheußlich. Und die Funktionen Primfaktorzerlegung, Primzahltest klein schreiben :wink: .
Hab jetzt glaub ich genug rumgekrittelt.
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

ich werds mal versuchen.
hoffe, dass es jetzt klappt, habe das mit den prints bereits reduziert, hat mich selbst auch genervt...
werde aber evtl noch ein kleines bisschen brauchen mit dem einbinden der schleifen in die definitionen...bin noch nicht so ganz fit mit dem verwenden der definitionen, weil ich das erst vor 2 wochen angefangen habe...

mfg
Antworten