ValueError: Ungültiges Literal für int () mit Basis 10

74

Ich habe ein Programm geschrieben, um y = a^xes zu lösen und es dann auf eine Grafik zu projizieren. Das Problem ist, dass wenn a < 1ich den Fehler erhalte:

ValueError: Ungültiges Literal für int () mit Basis 10.

Irgendwelche Vorschläge?

Hier ist der Traceback:

Traceback (most recent call last): 
   File "C:\Users\kasutaja\Desktop\EksponentfunktsioonTEST - koopia.py", line 13, in <module> 
   if int(a) < 0: 
ValueError: invalid literal for int() with base 10: '0.3' 

Das Problem tritt jedes Mal auf, wenn ich eine Zahl eingebe, die kleiner als eins, aber größer als 0 ist. In diesem Beispiel war es 0,3.

Das ist mein Code:

#  y = a^x

import time
import math
import sys
import os
import subprocess
import matplotlib.pyplot as plt
print ("y = a^x")
print ("")
a = input ("Enter 'a' ")
print ("")
if int(a) < 0:
    print ("'a' is negative, no solution")
elif int(a) == 1:
    print ("'a' is equal with 1, no solution")
else:
    fig = plt.figure ()
    x = [-2,-1.75,-1.5,-1.25,-1,-0.75,-0.5,-0.25,0,0.25,0.5,0.75,1,1.25,1.5,1.75,2]
    y = [int(a)**(-2),int(a)**(-1.75),int(a)**(-1.5),int(a)**(-1.25),
            int(a)**(-1),int(a)**(-0.75),int(a)**(-0.5),int(a)**(-0.25),
            int(a)**(0),int(a)**(0.25),int(a)**(0.5),int(a)**(0.75),
            int(a)**1,int(a)**(1.25),int(a)**(1.5),int(a)**(1.75), int(a)**(2)]


    ax = fig.add_subplot(1,1,1)
    ax.set_title('y = a**x')
    ax.plot(x,y)
    ax.spines['left'].set_position('zero')
    ax.spines['right'].set_color('none')
    ax.spines['bottom'].set_position('zero')
    ax.spines['top'].set_color('none')
    ax.spines['left'].set_smart_bounds(True)
    ax.spines['bottom'].set_smart_bounds(True)
    ax.xaxis.set_ticks_position('bottom')
    ax.yaxis.set_ticks_position('left')


    plt.savefig("graph.png")
    subprocess.Popen('explorer "C:\\Users\\kasutaja\\desktop\\graph.png"')

def restart_program(): 
    python = sys.executable
    os.execl(python, python, * sys.argv)

if __name__ == "__main__":
    answer = input("Restart program? ")
    if answer.strip() in "YES yes Yes y Y".split():
        restart_program()
    else:
        os.remove("C:\\Users\\kasutaja\\desktop\\graph.png")
user1901162
quelle
2
Können Sie den vollständigen Traceback veröffentlichen, damit wir die Zeile (und Zeichenfolge) sehen können, die das Problem verursacht?
mgilson
1
Sie rufen int zu einer Reihe von Zeiten an. Es ist möglicherweise am besten, ein Recht bei der Eingabe zu überprüfen.
dm03514
1
Bitte teilen Sie uns mit, was Sie in den input()Anruf eingeben .
Gareth Latty
Es hieß < 1. Mein Gehirn hat sich registriert < 0. scheitern :-)
Lennart Regebro
Die Ausgabe, die Sie im Float-Format erhalten. Also einfach in float tippen.
Nishanth

Antworten:

81

Antworten:

Ihr Traceback sagt Ihnen, dass int()Ganzzahlen verwendet werden. Sie versuchen, eine Dezimalzahl anzugeben. Daher müssen Sie Folgendes verwenden float():

a = float(a)

Dies sollte wie erwartet funktionieren:

>>> int(input("Type a number: "))
Type a number: 0.3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '0.3'
>>> float(input("Type a number: "))
Type a number: 0.3
0.3

Computer speichern Nummern auf verschiedene Arten. Python hat zwei Haupt. Ganzzahlen, in denen ganze Zahlen (ℤ) gespeichert sind, und Gleitkommazahlen, in denen reelle Zahlen (ℝ) gespeichert sind. Sie müssen die richtige verwenden, je nachdem, was Sie benötigen.

(Python ist ziemlich gut darin, dies von Ihnen weg zu abstrahieren. Die meisten anderen Sprachen haben beispielsweise auch Gleitkommazahlen mit doppelter Genauigkeit, aber Sie müssen sich darüber keine Gedanken machen. Seit 3.0 konvertiert Python auch automatisch ganze Zahlen zu schweben, wenn Sie sie teilen, so ist es eigentlich sehr einfach, damit zu arbeiten.)

Vorherige Vermutung der Antwort, bevor wir den Traceback hatten:

Ihr Problem ist, dass alles, was Sie eingeben, nicht in eine Zahl umgewandelt werden kann. Dies kann durch viele Dinge verursacht werden, zum Beispiel:

>>> int(input("Type a number: "))
Type a number: -1
-1
>>> int(input("Type a number: "))
Type a number: - 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '- 1'

Das Hinzufügen eines Leerzeichens zwischen -und 1führt dazu, dass die Zeichenfolge nicht korrekt in eine Zahl analysiert wird. Dies ist natürlich nur ein Beispiel, und Sie müssen uns mitteilen, welchen Input Sie geben, damit wir sicher sagen können, um welches Problem es sich handelt.

Hinweise zum Codestil:

y = [int(a)**(-2),int(a)**(-1.75),int(a)**(-1.5),int(a)**(-1.25),
            int(a)**(-1),int(a)**(-0.75),int(a)**(-0.5),int(a)**(-0.25),
            int(a)**(0),int(a)**(0.25),int(a)**(0.5),int(a)**(0.75),
            int(a)**1,int(a)**(1.25),int(a)**(1.5),int(a)**(1.75), int(a)**(2)]

Dies ist ein Beispiel für eine wirklich schlechte Codierungsgewohnheit. Wo Sie immer wieder etwas kopieren, stimmt etwas nicht. Erstens verwenden Sie int(a)eine Menge Male, wo immer Sie dies tun, sollten Sie stattdessen den Wert einer Variablen zuweisen und diese stattdessen verwenden, um zu vermeiden, dass Sie den Wert immer wieder eingeben (und den Computer zur Berechnung zwingen):

a = int(a)

In diesem Beispiel weise ich den Wert wieder zu aund überschreibe den alten Wert mit dem neuen, den wir verwenden möchten.

y = [a**i for i in x]

Dieser Code erzeugt das gleiche Ergebnis wie das Monster oben, ohne dass die Massen immer wieder dasselbe ausschreiben müssen. Es ist ein einfaches Listenverständnis . Dies bedeutet auch, dass wenn Sie bearbeiten x, Sie nichts tun müssen y, es wird natürlich entsprechend aktualisiert.

Beachten Sie auch, dass PEP-8, der Python-Styleguide , dringend empfiehlt, beim Ausführen eines Funktionsaufrufs keine Leerzeichen zwischen einem Bezeichner und den Klammern zu lassen .

Gareth Latty
quelle
1
Obwohl ich damit einverstanden bin, geht es nicht wirklich um das Problem von OP. Dies könnte auch noch einfacher gemacht werden, wenn OP numpyArrays verwenden würde (die verfügbar wären, da dies erforderlich ist matplotlib)
mgilson
@mgilson Einverstanden, ich musste dies nur so schnell wie möglich posten, das ist ein Monster von einer Liste. Ich werde mit einer Antwortantwort aktualisieren, sobald das OP die erforderlichen Informationen bereitstellt (ich werde jetzt eine Vermutung anstellen).
Gareth Latty
Hier ist der Traceback Traceback (letzter Aufruf zuletzt): Datei "C: \ Users \ kasutaja \ Desktop \ EksponentfunktsioonTEST - koopia.py", Zeile 13, in <Modul>, wenn int (a) <0: ValueError: ungültiges Literal für int () mit Basis 10: '0.3' Das Problem tritt jedes Mal auf, wenn ich eine Zahl
eingebe
1
@ user1901162 Ich habe meine Antwort aktualisiert, aber bitte bearbeiten Sie diese Informationen in der Frage, anstatt sie zu kommentieren.
Gareth Latty
27

Wie Lattyware sagte, gibt es einen Unterschied zwischen Python2 und Python3, der zu diesem Fehler führt:

Mit Python2 erhalten int(str(5/2))Sie 2. Mit Python3 erhalten Sie dasselbe: ValueError: ungültiges Literal für int () mit Basis 10: '2.5'

Wenn Sie eine Zeichenfolge konvertieren müssen, die float anstelle von int enthalten könnte, sollten Sie immer die folgende hässliche Formel verwenden:

int(float(myStr))

Wie float('3.0')und float('3')geben Sie 3.0, aber int('3.0')gibt Ihnen den Fehler.

Le Droid
quelle
1
Warum ist es hässlich?
StarSweeper
5
@StarSweeper 2 Casting statt eines ist nicht süß.
Le Droid
10

Es ist möglicherweise besser, abei der Eingabe richtig zu validieren .

try:
  a = int(input("Enter 'a' "))
except ValueError:
  print('PLease input a valid integer')

Dies wird entweder ain ein int umgewandelt, sodass Sie sicher sein können, dass es sich um eine Ganzzahl für alle späteren Verwendungen handelt, oder es behandelt die Ausnahme und benachrichtigt den Benutzer

dm03514
quelle