82

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

4 回答 4

97

回答:

您的回溯告诉您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强烈建议在进行函数调用时不要在标识符和括号之间留有空格

于 2012-12-13T14:12:47.697 回答
29

正如 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))

Asfloat('3.0')float('3')给你 3.0,但int('3.0')给你错误。

于 2013-11-07T20:20:35.930 回答
10

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

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

这要么转换a为一个 int,因此您可以确保它是一个供以后使用的整数,或者它处理异常并提醒用户

于 2012-12-13T14:11:54.370 回答
0

int() 转换无法处理有小数点的字符串数字

- 示例 --> int('13.5') 会给你错误,但是 int('13') 会将字符串转换为整数

为什么:这被认为是用户需要的显式转换,因为如果您读取数据集并且不知道它有浮点数,它可以防止您丢失 0.5 之类的信息

Work Around >

int(Float("13.5"))

我遇到的一个真实示例:我希望将数字作为 int 而 int(I["mpg"]) 直接不起作用,所以我使用 float() 然后 int()

sum([int(float(i["mpg"])) for i in file])//len(file)
于 2021-12-13T22:40:31.837 回答