为什么我不能运行我的Regulafalsi代码?由于NoneType错误

时间:2017-11-17 14:09:20

标签: python equation-solving

这是我的一个根查找方法的代码。

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;对象不可迭代。

如果你知道问题是什么,请告诉你。

1 个答案:

答案 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

但这真的很难看,而且实际上是不好的做法(人们希望函数的返回值是一致的类型)。