我编写了一个程序来求解y = a^x,然后将其投影在图形上。问题是,每当a < 1出现错误时:
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")
您的回溯告诉您int()采用整数,您试图给出一个十进制数,因此您需要使用float():
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将导致字符串无法正确解析为数字。当然,这只是一个例子,您必须告诉我们您所提供的意见,以便我们能够确定问题所在。
-
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)需要花费大量的时间,无论您在何处执行此操作,都应将值分配给变量,然后使用该值,避免一次又一次地键入(并迫使计算机计算)该值:
int(a)
a = int(a)
在此示例中,我将值分配回a,用我们要使用的新值覆盖旧值。
a
y = [a**i for i in x]
这段代码产生的效果与上面的怪物相同,而无需大量重复编写相同的内容。这是一个简单的列表理解。这也意味着,如果您编辑x,则无需对进行任何操作y,它自然会更新以适合您。
x
y
还要注意的是PEP-8,Python的风格指南,强烈建议进行一个函数调用时,不要给自己留下一个标识符和括号之间的空格。