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

新手上路,请多包涵

我写了一个程序来解决 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")

原文由 user1901162 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 630
2 个回答

回答:

你的回溯告诉你 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 做任何事情,它自然会更新以适应。

另请注意, Python 风格指南 PEP-8 强烈建议您在进行函数调用时不要在标识符和括号之间留有空格

原文由 Gareth Latty 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

对于 Python2, int(str(5/2)) 给你 2。对于 Python3,同样给你: ValueError: invalid literal for int() with base 10: ‘2.5’

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

 int(float(myStr))

作为 float('3.0')float('3') 给你 3.0,但是 int('3.0') 给你错误。

原文由 Le Droid 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题