Ich habe ein Programm geschrieben, um y = a^x
es zu lösen und es dann auf eine Grafik zu projizieren. Das Problem ist, dass wenn a < 1
ich 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")
python
python-3.x
user1901162
quelle
quelle
input()
Anruf eingeben .< 1
. Mein Gehirn hat sich registriert< 0
. scheitern :-)Antworten:
Antworten:
Ihr Traceback sagt Ihnen, dass
int()
Ganzzahlen verwendet werden. Sie versuchen, eine Dezimalzahl anzugeben. Daher müssen Sie Folgendes verwendenfloat()
: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
-
und1
fü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):In diesem Beispiel weise ich den Wert wieder zu
a
und ü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üsseny
, 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 .
quelle
numpy
Arrays verwenden würde (die verfügbar wären, da dies erforderlich istmatplotlib
)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:
Wie
float('3.0')
undfloat('3')
geben Sie 3.0, aberint('3.0')
gibt Ihnen den Fehler.quelle
Es ist möglicherweise besser,
a
bei der Eingabe richtig zu validieren .try: a = int(input("Enter 'a' ")) except ValueError: print('PLease input a valid integer')
Dies wird entweder
a
in 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 Benutzerquelle