Eu escrevi um programa para resolver y = a^x
e então o projetei em um gráfico. O problema é que sempre que a < 1
eu recebo o erro:
ValueError: inválido literalmente para int () com base 10.
Alguma sugestão?
Aqui's o 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'
O problema surge sempre que coloco um número menor que um, mas maior que 0. Para este exemplo era 0,3 .
Este é o meu código:
# 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")
Seu traceback está lhe dizendo que int()
toma inteiros, você está tentando dar um decimal, então você precisa utilizar float()
:
a = float(a)
Isto deve funcionar como esperado:
>>> 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
Os computadores armazenam números de várias maneiras diferentes. Python tem dois principais. Integers, que armazenam números inteiros (ℤ), e números de ponto flutuante, que armazenam números reais (ℝ). Você precisa usar o correto com base no que você precisa.
(Como nota, Python é muito bom em abstrair isso de você, a maioria das outras linguagens também tem números de ponto flutuante de precisão dupla, por exemplo, mas você não'não precisa se preocupar com isso. Desde o 3.0, Python também converte automaticamente inteiros para flutuadores se você dividi-los, então ele's na verdade é muito fácil de trabalhar).
O seu problema é que o que quer que você esteja digitando pode't ser convertido em um número. Isto pode ser causado por muitas coisas, por exemplo:
>>> 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'
Adicionar um espaço entre o -
e 1
fará com que a string não seja interpretada corretamente em um número. Isto é, claro, apenas um exemplo, e você terá que nos dizer que input você está dando para que possamos dizer com certeza qual é o problema.
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)]
Este é um exemplo de um mau hábito de codificação. Onde você está copiando algo novamente e novamente algo está errado. Primeiro, você utiliza int(a)
uma tonelada de vezes, onde quer que você faça isso, você deve atribuir o valor a uma variável, e utilizar isso, evitando digitar (e forçando o computador a calcular) o valor de novo e de novo:
a = int(a)
Neste exemplo eu atribuo o valor de volta para `a', substituindo o valor antigo pelo novo que queremos utilizar.
y = [a**i for i in x]
Este código produz o mesmo resultado que o monstro acima, sem as massas de escrever a mesma coisa uma e outra vez. It's um simples [compreensão de lista][1]. Isto também significa que se você editar x
, você não'não precisa fazer nada para y
, ele naturalmente será atualizado para se adequar.
Note também que PEP-8, o guia de estilo Python, sugere fortemente que você não't deixe espaços entre um identificador e os parênteses ao fazer uma chamada de função.
Como Lattyware disse, há uma diferença entre Python2 & Python3 que leva a este erro:
Com Python2, int(str(5/2))
dá-lhe 2.
Com Python3, o mesmo lhe dá: ValueError: inválido literalmente para int() com base 10: '2.5'
Se você precisar converter alguma string que possa conter float em vez de int, você deve sempre usar a seguinte fórmula feia:
int(float(myStr))
Como float('3.0')
e float('3')
lhe dá 3.0, mas int('3.0')
lhe dá o erro.
Talvez seja melhor validar o a
logo no momento em que ele é inserido.
try:
a = int(input("Enter 'a' "))
except ValueError:
print('PLease input a valid integer')
Isto ou lança `a' para um int para que você possa ter certeza de que é um inteiro para todos os usos posteriores ou handles a exceção e alerta o usuário