ValueError:具有基数10的int()的无效文字

时间:2012-12-13 14:09:27

标签: python python-3.x

我编写了一个解决y = a^x的程序,然后将其投影到图表上。问题是每当a < 1我收到错误时:

  

ValueError:对于带有基数为10的int(),文字无效。

有什么建议吗?

这是追溯:

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' 

每次我输入一个小于1但大于0的数字时就会出现问题。对于这个例子,它是0.3。

这是我的代码:

#  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")

3 个答案:

答案 0 :(得分:64)

答案:

你的回溯告诉你int()占用整数,你试图给出小数,所以你需要使用float()

a = float(a)

这应该按预期工作:

>>> 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

计算机以各种不同的方式存储数字。 Python有两个主要的。整数,存储整数(ℤ)和浮点数,存储实数(ℝ)。您需要根据需要使用正确的。

(作为一个注释,Python非常擅长从你那里抽象出来,大多数其他语言也有双精度浮点数,例如,你不需要担心。从3.0开始,Python也会如果你将它们分开,则自动将整数转换为浮点数,因此它实际上非常容易使用。)

我们在回溯之前的答案是先前的猜测:

您的问题是,无论您输入什么内容都无法转换为数字。这可能是由许多事情引起的,例如:

>>> 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'

-1之间添加空格将导致字符串无法正确解析为数字。当然,这只是一个例子,你必须告诉我们你给我们的输入是什么,以便能够确定问题是什么。

关于代码风格的建议:

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)]

这是一个非常糟糕的编码习惯的例子。你在一次又一次地复制某些东西是错误的。首先,您使用int(a)很多次,无论您在何处执行此操作,都应该将值赋给变量,而是使用它来避免一次又一次地键入(并强制计算机计算)该值:

a = int(a)

在这个例子中,我将值赋值回a,用我们想要使用的新值覆盖旧值。

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

这段代码与上面的怪物产生的结果相同,没有大量的反复写出相同的东西。这是一个简单的list comprehension。这也意味着,如果您修改x,则无需对y执行任何操作,它会自然更新以适应。

另请注意PEP-8, the Python style guidesuggests strongly that you don't leave spaces between an identifier and the brackets when making a function call

答案 1 :(得分:23)

正如Lattyware所说,Python2和DSP之间存在差异。导致此错误的Python3:

使用Python2,int(str(5/2))为您提供2。 使用Python3,同样的结果为: ValueError:int()的无效文字,基数为10:'2.5'

如果你需要转换一些可能包含float而不是int的字符串,你应该总是使用以下丑陋的公式:

int(float(myStr))

由于float('3.0')float('3')会给你3.0,但int('3.0')会给你错误。

答案 2 :(得分:9)

最好在输入时验证a

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

这会将a强制转换为int,这样您就可以确信它是所有以后使用的整数,或handles异常并提醒用户