83 votes

ValueError : invalid literal for int () with base 10

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

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

Des suggestions ?

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. Dans cet exemple, il s'agissait de 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")

101voto

Lattyware Points 37257

Réponse :

Votre traceback vous indique 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 stockent les nombres de différentes manières. Python en a deux principales. Les 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.

(La plupart des autres langages ont également des nombres à virgule flottante en double précision, par exemple, mais vous n'avez pas besoin de vous en préoccuper. Depuis la version 3.0, Python convertit automatiquement les nombres entiers en nombres flottants si vous les divisez, ce qui facilite grandement la tâche).

Estimation précédente de la réponse avant que nous n'ayons le traceback :

Votre problème est que ce que vous tapez ne peut pas être converti en nombre. Cela peut être dû à 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'

L'ajout d'un espace entre les - y 1 ne permettra pas d'analyser correctement la chaîne de caractères en un nombre. Il ne s'agit bien sûr que d'un exemple, et vous devrez nous indiquer les données que vous saisissez 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)]

C'est un exemple de très mauvaise habitude de codage. Lorsque vous copiez quelque chose encore et encore, il y a quelque chose qui ne va pas. Tout d'abord, vous utilisez int(a) souvent, lorsque vous faites cela, vous devriez plutôt assigner la valeur à une variable et l'utiliser à la place, évitant ainsi de taper (et d'obliger l'ordinateur à calculer) la valeur encore et encore :

a = int(a)

Dans cet exemple, j'attribue la valeur à a en remplaçant l'ancienne valeur par 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 les masses d'écrire la même chose encore et encore. Il s'agit d'un simple compréhension de la liste . Cela signifie également que si vous modifiez x vous n'avez rien à faire pour y il sera naturellement mis à jour en conséquence.

Il convient également de noter que PEP-8, le guide de style de Python , suggère fortement de ne pas laisser d'espace entre un identifiant et les crochets lors de l'appel d'une fonction .

29voto

Le Droid Points 455

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

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

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

int(float(myStr))

En tant que float('3.0') y float('3') vous donne 3.0, mais int('3.0') vous donne l'erreur.

10voto

dm03514 Points 20748

Il serait peut-être préférable de valider a au moment de la saisie.

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

Il s'agit soit d'un jet d'eau, soit d'un jet d'air. a à un int afin d'être sûr qu'il s'agit bien d'un integer pour toutes les utilisations ultérieures, ou bien il poignées l'exception et avertit l'utilisateur

0voto

Le casting int() ne peut pas gérer les nombres de type chaîne de caractères qui ont des points décimaux

- exemple --> int('13.5') vous donnera une erreur, mais int('13') convertira la chaîne en entier. chaîne de caractères en entier

Pourquoi : Ceci est considéré comme un casting explicite requis par l'utilisateur car il évite de perdre des informations comme 0.5 si vous lisez un ensemble de données sans savoir qu'il contient des nombres à virgule flottante.

Work Around >

int(Float("13.5"))

Un exemple concret auquel j'ai été confronté : je voulais que les nombres soient exprimés en int alors que int(I["mpg"]) ne fonctionnait pas directement, j'ai donc utilisé float() puis int().

sum([int(float(i["mpg"])) for i in file])//len(file)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X