这是我的一个根查找方法的代码。
from __future__ import division
def falseposition(f, a, b, imax=50, tolerance=1.0e-10):
i = 0
while i < imax:
c = (a*f(b)-b*f(a))/(f(b) - f(a))
if c == 0 or f(c) < tolerance:
return c, i
elif (f(a)*f(c))<0:
b=c
else:
a=c
i += 1
f = lambda x: x**5 - x + 1
root, steps = falseposition(f, 1, 8)
print ("The root is", root, "and the value is", f(root), "; steps taken:", steps)
有一个TypeError。它说&#39; NoneType&#39;对象不可迭代。
如果你知道问题是什么,请告诉你。
答案 0 :(得分:1)
falseposition
函数仅在 c
变得更大之前找到符合标准的值i
时,会明确返回比imax
。如果它没有,那么它会从while循环中掉出,到达函数体的末尾,然后(隐含地)返回None
。在这种情况下,root, steps = falseposition(f, 1, 8)
语句实际上变为root, steps = None
,并且由于None
不可迭代,因此会出现此错误。
这里主要有两个解决方案:
在函数末尾返回None, i
作为默认值(None
表示函数未能找到c
的匹配值:
def falseposition(f, a, b, imax=50, tolerance=1.0e-10):
i = 0
while i < imax:
c = (a*f(b)-b*f(a))/(f(b) - f(a))
if c == 0 or f(c) < tolerance:
return c, i
elif (f(a)*f(c))<0:
b=c
else:
a=c
i += 1
# nothing found
return None, i
或者引发一些异常(让调用者代码捕获它):
def falseposition(f, a, b, imax=50, tolerance=1.0e-10):
i = 0
while i < imax:
c = (a*f(b)-b*f(a))/(f(b) - f(a))
if c == 0 or f(c) < tolerance:
return c, i
elif (f(a)*f(c))<0:
b=c
else:
a=c
i += 1
# nothing found
raise ValueError("No matching c value")
哪些解决方案有意义取决于背景和诸如此类的东西,但是很明显可能有很多情况下没有适当的解决方案&#34;将会找到第一个(返回(None
,i)`)似乎是一个很好的候选人。
您当然可以按原样保留该功能,并确保在尝试解压缩之前测试返回值:
result = falseposition(f, 1, 8)
if result is None:
print("oops, nothing found")
root, steps = result
# etc
但这真的很难看,而且实际上是不好的做法(人们希望函数的返回值是一致的类型)。