Seite 1 von 1

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

Verfasst: Dienstag 12. Februar 2008, 08:29
von Evil4President
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

Verfasst: Dienstag 12. Februar 2008, 08:58
von Evil4President
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

Verfasst: Dienstag 12. Februar 2008, 09:28
von Rebecca
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...

Verfasst: Dienstag 12. Februar 2008, 15:51
von Evil4President
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

Verfasst: Mittwoch 13. Februar 2008, 16:18
von Evil4President
hallo ;)

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

Verfasst: Mittwoch 13. Februar 2008, 16:32
von BlackJack
Also mir ist das zu gross, zu verschachtelt und zu viel globaler Zustand um mich damit auseinander zu setzen. Sorry.

Verfasst: Mittwoch 13. Februar 2008, 16:41
von gerold
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:
    ...
.

Verfasst: Mittwoch 13. Februar 2008, 16:43
von Evil4President
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

Verfasst: Mittwoch 13. Februar 2008, 16:45
von Evil4President
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. ;)

Verfasst: Mittwoch 13. Februar 2008, 22:22
von Balgofil
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.

Verfasst: Donnerstag 14. Februar 2008, 16:57
von Evil4President
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