J'ai écrit un programme pour résoudre y = a^x
puis le projeter sur un graphique. Le problème est que chaque fois que a < 1
je reçois l'erreur:
ValueError: littéral non valide pour int () avec base 10.
Aucune suggestion?
Voici la 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'
Le problème se pose chaque fois que je mets un nombre inférieur à un, mais supérieur à 0. Pour cet exemple, il était de 0,3.
Ceci est mon 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 __== "__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")
Votre trace vous dit que int()
prend des entiers, vous essayez de donner une décimale, vous devez donc utiliser float()
:
a = float(a)
Cela devrait fonctionner comme prévu:
>>> 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
Les ordinateurs enregistrent les numéros de différentes manières. Python a deux principaux. Entiers, qui stockent des nombres entiers () et des nombres à virgule flottante, qui stockent des nombres réels (). Vous devez utiliser celui qui convient en fonction de vos besoins.
(Remarque: Python est assez doué pour résumer ceci loin de vous, la plupart des autres langues ont également des nombres à virgule flottante en double précision, par exemple, mais vous n'avez pas à vous en préoccuper. Depuis la version 3.0, Python convertira également automatiquement les entiers en flottants si vous les divisez, ce qui rend le travail très facile.)
Votre problème est que tout ce que vous tapez ne peut pas être converti en nombre. Cela pourrait être causé par beaucoup de choses, par exemple:
>>> 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'
Si vous ajoutez un espace entre -
et 1
, la chaîne ne sera pas analysée correctement dans un nombre. Ce n’est bien sûr qu’un exemple, et vous devrez nous dire quelle contribution vous apportez pour que nous puissions dire avec certitude quel est le problème.
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)]
Ceci est un exemple d'une très mauvaise habitude de codage. Là où vous copiez quelque chose encore et encore, quelque chose ne va pas. Tout d'abord, vous utilisez int(a)
une tonne de fois. Dans tous les cas, vous devez affecter la valeur à une variable et l'utiliser à la place, en évitant de taper (et de forcer l'ordinateur à calculer) la valeur encore et encore:
a = int(a)
Dans cet exemple, je réattribue la valeur à a
, en remplaçant l'ancienne valeur par la nouvelle que nous souhaitons utiliser.
y = [a**i for i in x]
Ce code produit le même résultat que le monstre ci-dessus, sans que les masses écrivent la même chose encore et encore. C'est un simple compréhension de la liste . Cela signifie également que si vous éditez x
, vous n'avez rien à faire pour y
, il se mettra naturellement à jour en conséquence.
Notez également que PEP-8, le guide de style Python , suggère fortement de ne pas laisser d'espaces entre un identificateur et les crochets lors d'un appel de fonction .
Comme Lattyware l’a dit, il existe une différence entre Python2 et Python3 qui conduit à cette erreur:
Avec Python2, int(str(5/2))
vous donne 2. Avec Python3, la même chose vous donne: ValueError: littéral invalide pour int () avec base 10: '2.5'
Si vous devez convertir une chaîne pouvant contenir float au lieu de int, vous devez toujours utiliser la formule laide suivante:
int(float(myStr))
Comme float('3.0')
et float('3')
vous donne 3,0, mais int('3.0')
vous donne l'erreur.
Il serait peut-être préférable de valider a
quand il est entré.
try:
a = int(input("Enter 'a' "))
except ValueError:
print('PLease input a valid integer')
Ceci soit jette a
sur un entier afin que vous puissiez être sûr qu'il s'agit d'un entier pour toutes les utilisations ultérieures, ou bien handles l'exception et alerte l'utilisateur