欧拉';Python变量输入类型的s方法
我对以下代码有问题。它目前正在进行中,但我遇到的一个大问题是,无论我尝试了哪种类型的输入,我对函数的输入都会返回一个错误。它要么返回带有错误类型的问题,要么返回未定义x的问题(如果输入x之类的函数)欧拉';Python变量输入类型的s方法,python,variables,input,Python,Variables,Input,我对以下代码有问题。它目前正在进行中,但我遇到的一个大问题是,无论我尝试了哪种类型的输入,我对函数的输入都会返回一个错误。它要么返回带有错误类型的问题,要么返回未定义x的问题(如果输入x之类的函数) f = raw_input("Please enter function: y' = ") x0 = float(raw_input("Please enter the initial x value: ")) y0 = float(raw_input("Please enter the initi
f = raw_input("Please enter function: y' = ")
x0 = float(raw_input("Please enter the initial x value: "))
y0 = float(raw_input("Please enter the initial y value: "))
xmax = float(raw_input("Please enter the value of x at which to approximate the solution: "))
h = float(raw_input("Please enter the step size: "))
showall = int(raw_input("Would you like to see all steps (1) or only the approximate solution (2)? "))
def f(x,y):
value = f
return (value)
def euler(x0,y0,h,xmax):
x=x0; y=y0; xd=[x0]; yd=[y0];
while x<xmax:
y = y + h*f(x,y)
yd.append(y)
x=x+h
xd.append(x)
return(xd,yd)
(xvals,yvals) = euler(x0,y0,h,xmax)
if showall == 1:
print ""
print "x_n y_n"
for uv in zip(xvals, yvals):
print uv[0],uv[1]
elif showall == 2:
print ""
print "x_n y_n"
print xvals, yvals
else:
print ""
print "There has been an error with your choice of what to see; showing all steps."
print ""
print "x_n y_n"
for uv in zip(xvals, yvals):
print uv[0],uv[1]
print " "
plotask = int(raw_input("Would you like to see a plot of the data? Yes (1); No (2) "))
if plotask == 1:
print "1"
elif plotask == 2:
pass
else:
print ""
print "Could not understand answer; showing plot."
f=原始输入(“请输入函数:y'=”)
x0=浮点(原始输入(“请输入初始x值:”)
y0=浮点(原始输入(“请输入初始y值:”))
xmax=float(原始输入(“请输入近似解的x值:”)
h=浮点(原始输入(“请输入步长:”)
showall=int(原始输入(“您想查看所有步骤(1)还是仅查看近似解(2)”)
定义f(x,y):
值=f
返回(值)
def euler(x0,y0,h,xmax):
x=x0;y=y0;xd=[x0];yd=[y0];
而x此函数:
def f(x,y):
value = f
return (value)
可以看到返回一个函数。特别是,它只返回自身,f
。(注意,f
不同于f()
或f(x,y)
评估为
y = y + h*f
这是一个错误,因为f
是一个函数,您不能将函数乘以一个数字(与计算函数调用的结果相反-例如,如果f(x,y)
返回一个数字,那么您的代码将工作)您遇到的问题是,您的函数f
使用的名称与您在代码的第一行中收集的公式字符串相同。但是,仅修复名称并不能满足您的需要,我认为
您的f
函数需要对公式求值,才能得到数值结果。我想您需要:
formula = raw_input("Please enter function: y' = ")
def f(x, y):
return eval(formula)
虽然这是可行的,但我想指出的是,通常不建议使用eval
,尤其是当您要计算的字符串来自用户时。这是因为它可以包含任意Python代码,这些代码将被运行。eval(“\uu import\uuuuuuuuuuo(os.system)(“rm-Rf*”)
可能会毁了您的一天(不要运行此代码!).请显示准确的错误消息和堆栈跟踪。Post已更新以显示错误和跟踪。我是新来的,不知道这一点。谢谢!我原以为这是问题所在,但如果我尝试直接用函数替换值,如value=x*y
而不是f=x*y;value=f
中的值,是否有其他方法不起作用o在我可以提示输入的地方执行此操作?这是因为当您执行value=x*y
时,value
是一个数字(计算x*y
的结果,但value=f
使value
成为一个函数(计算f
的结果是返回f
,这是一个函数)。要将函数转换为它返回的结果,必须对其求值,这需要调用它,如f()
或f(x+y)
。谢谢。当我发表评论时,我突然想起了你试图解释的内容。我现在明白了。谢谢,这解决了我的问题!关于使用eval,只要用户不输入某种类型的python代码就可以了,对吗?@danielu13如果你想制作一个不使用eval的计算器(->是安全的),查找python的PLY。它是一个lexer/解析器,非常适合编写表达式解析器(我已经在其中编写了一个)@Patashu谢谢你的建议,我会研究它。
y = y + h*f
formula = raw_input("Please enter function: y' = ")
def f(x, y):
return eval(formula)