ValueError : littéral invalide pour int () avec base 10

J'ai écrit un programme pour résoudre y = a^x et ensuite le projeter sur un graphique. Le problème est que chaque fois que a < 1 j'obtiens l'erreur :

ValueError : invalid literal for int () with base 10.

Avez-vous des suggestions ?

Voici l'historique :

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 survient chaque fois que je mets un nombre plus petit que 1, mais plus grand que 0. Pour cet exemple, c'était 0,3 .

Voici 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 __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")
Solution

Réponse :

Votre traceback vous dit que int() prend des entiers, vous essayez de donner un décimal, donc vous devez 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 "", line 1, in 
ValueError: invalid literal for int() with base 10: '0.3'
>>> float(input("Type a number: "))
Type a number: 0.3
0.3

Les ordinateurs stockent les nombres de différentes manières. Python en a deux principales. Les nombres entiers, qui stockent les nombres entiers (ℤ), et les nombres à virgule flottante, qui stockent les nombres réels (ℝ). Vous devez utiliser la bonne méthode en fonction de vos besoins.

(À titre d'information, Python est plutôt doué pour abstraire ce genre de choses, la plupart des autres langages disposent également de nombres à virgule flottante en double précision, par exemple, mais vous n'avez pas à vous en préoccuper. Depuis la version 3.0, Python convertit aussi automatiquement les entiers en flottants si vous les divisez, de sorte qu&#8217il est en fait très facile de travailler avec).

Réponse précédente avant que nous ayons le retour de trace :

Votre problème est que ce que vous tapez ne peut pas être converti en un nombre. Cela peut ê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 "", line 1, in 
ValueError: invalid literal for int() with base 10: '- 1'

Si vous ajoutez un espace entre le - et le 1, la chaîne ne sera pas convertie correctement en un nombre. Il ne s'agit bien sûr que d'un exemple, et vous devrez nous dire quelles sont vos données d'entrée pour que nous puissions déterminer avec certitude la nature du problème.

Conseils sur le style de code :

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. Lorsque vous copiez quelque chose encore et encore, quelque chose ne va pas. Premièrement, vous utilisez int(a) une tonne de fois, chaque fois que vous faites cela, vous devriez plutôt assigner la valeur à une variable, et l'utiliser à la place, évitant ainsi de taper (et de forcer l'ordinateur à calculer) la valeur encore et encore :

a = int(a)

Dans cet exemple, je réassigne la valeur à a, en écrasant l'ancienne valeur avec la nouvelle que nous voulons utiliser.

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

Ce code produit le même résultat que le monstre ci-dessus, sans la masse d'écrire la même chose encore et encore. Il s'agit d'une simple [compréhension de liste][1]. Cela signifie également que si vous modifiez x, vous n'avez pas besoin de faire quoi que ce soit à y, il se mettra naturellement à jour.

Notez également que [PEP-8, le guide de style de Python][2], [suggère fortement de ne pas laisser d'espaces entre un identifiant et les parenthèses lors de l'appel d'une fonction][3].

[1] : http://www.youtube.com/watch?v=pShL9DCSIUw [2] : http://www.python.org/dev/peps/pep-0008/ [3] : http://www.python.org/dev/peps/pep-0008/#pet-peeves

Commentaires (4)

Comme l'a dit Lattyware, il y a une différence entre Python2 &amp ; Python3 qui conduit à cette erreur :

Avec Python2, int(str(5/2)) vous donne 2. Avec Python3, la même chose vous donne : ValueError : invalid literal for int() with base 10 : '2.5'.

Si vous devez convertir une chaîne de caractères qui pourrait contenir un flottant au lieu d'un int, vous devez toujours utiliser la formule suivante :

int(float(myStr))

Comme float('3.0&#39 ;) et float('3&#39 ;) vous donnent 3.0, mais int('3.0&#39 ;) vous donne l'erreur.

Commentaires (2)

Il serait peut-être préférable de valider a dès sa saisie.

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

Soit a est converti en un entier, ce qui permet de s'assurer qu'il s'agit bien d'un entier pour toutes les utilisations ultérieures, soit il [gère][1] l'exception et alerte l'utilisateur.

[1] : http://docs.python.org/3/tutorial/errors.html#handling-exceptions

Commentaires (0)