ValueError:int()以10为底的无效文字


76

我编写了一个程序来求解y = a^x,然后将其投影在图形上。问题是,每当a < 1出现错误时:

ValueError:int()以10为底的无效文字。

有什么建议?

这是回溯:

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

2
您可以发布完整的追溯,以便我们看到引起问题的行(和字符串)吗?
mgilson 2012年

1
您多次调用int。输入权利时,最好验证一下权利。
dm03514 2012年

1
请告诉我们您在input()通话中输入的内容。
Gareth Latty

它说< 1。我的脑登记了< 0失败:-)
Lennart Regebro

您得到的输出为float格式。因此,只需将类型转换为float。
Nishanth

Answers:


84

回答:

您的回溯告诉您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]

这段代码产生的效果与上面的怪物相同,而无需大量重复编写相同的内容。这是一个简单的列表理解。这也意味着,如果您进行编辑x,则无需对进行任何操作y,它自然会更新为适合。

还要注意的是PEP-8,Python的风格指南强烈建议进行一个函数调用时,不要给自己留下一个标识符和括号之间的空格


1
虽然我同意这一点,但它并没有真正解决OP的问题。此外,可以这样做更容易,如果OP会使用numpy阵列(这会因为它需要提供matplotlib
mgilson

@mgilson同意,我只需要尽快发布此消息,那是列表中的一个怪物。OP将提供所需的信息后,我将立即更新一个答案(我将给出一个猜测)。
Gareth Latty 2012年

这是回溯回溯(最近一次调用回溯):文​​件“ C:\ Users \ kasutaja \ Desktop \ EksponentfunktsioonTEST-koopia.py”,<模块>中的第13行,如果int(a)<0:ValueError:int的无效文字()的基数为10:“ 0.3”每次我输入一个小于1但大于0的数字时,都会出现此问题。对于此示例,它是0.3
user1901162

1
@ user1901162我已经更新了我的答案,但请不要在评论中将此信息编辑为问题。
Gareth Latty 2012年

27

正如Lattyware所说,Python2和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')给你的错误。


1
为什么难看?
StarSweeper

5
@StarSweeper 2铸造而不是一个不是很可爱。
Le Droid

10

a输入时验证正确可能会更好。

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

这可以强制转换a为int,以便您可以确保以后使用的整数,也可以处理异常并警告用户

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.