TypeError:'NoneType'对象不可迭代。为什么我会收到此错误?

时间:2016-06-11 09:11:17

标签: python recursion

函数 compute_root 使用牛顿的逐次逼近方法来找到多项式零点的足够好的近似值(这就是问题所在)。函数 evalPoly 计算特定x值的多项式的值,函数 ddx2 计算多项式的导数。

poly2 = (2,3,1,5) #poly2 represents the polynomial 5x^3+x^2+3x+1

def evalPoly(poly,x):
    degree = 0
    ans = 0
    for index in poly:
        ans += (index * (x**degree))
        degree += 1
    return ans  

def ddx2(tpl):
    lst = list(tpl)
    for i in range(len(lst)):
        lst[i] = lst[i]*i
        if i != 0:
            lst[i-1] = lst[i]
    del lst[-1]
    tpl = tuple(lst)

def compute_root(poly,x_0):
    epsilon = .001
    numGuesses = 1
    if abs(evalPoly(poly,x_0)) <= epsilon:
        ans = (evalPoly(poly,x_0),numGuesses)
        print ans
        return ans
    else:
        x_1 = x_0 - (evalPoly(poly,x_0)/evalPoly(ddx2(poly),x_0))
        # This is Newton's method of getting progressively better / 
        # "guesses"
        compute_root(poly,x_1)
        x_0 = x_1
        numGuesses += 1
        return x_0
        return poly

compute_root(poly2,2) #Here I call the function *compute_root*

当我调用该函数时,我收到此错误:

Samuels-MacBook:python barnicle$ python problemset2.py
Traceback (most recent call last):
  File "problemset2.py", line 160, in <module>
    compute_root(poly2,x_0)
  File "problemset2.py", line 156, in compute_root
    x_1 = x_0 - (evalPoly(poly,x_0)/evalPoly(ddx2(poly),x_0))
  File "problemset2.py", line 126, in evalPoly
    for index in poly:
TypeError: 'NoneType' object is not iterable

我知道python函数默认返回 none 。我认为产生错误是因为值 none 被传递到 evalPoly 中的参数 poly 。为什么会这样?

我觉得包含所有东西都是谨慎的,甚至是函数 ddx2 (在这个例子中还没有调用过),因为我不知道你是否需要它。我知道 compute_root 需要做很多工作,这只是第一步。感谢!!!

UPDATE !!!

我注意到我收到了错误,因为我的函数 ddx2 缺少返回值,所以它当然返回值 none ,当然不是可迭代的。谢谢!!

UPDATE2 !!!

我在这里有完整的工作程序,我希望它可以在某个时候帮助某人。我花了很多时间在这上面。它来自麻省理工学院开放课件的电气工程和计算机科学6.00sc与John Guttag教授,问题集2。

poly5 = (-13.39, 0.0, 17.5, 3.0, 1.0) # represents the polynomial:
       # x^4+3x^3+17.5x^2-13.39 


def evalPoly(poly,x):
    degree = 0
    ans = 0
    for index in poly:
        ans += (index * (x**degree))
        degree += 1 
    return float(ans)
    return degree   

def ddx2(tpl):
    lst = list(tpl)
    for i in range(len(lst)):
        lst[i] = lst[i]*i
        if i != 0:
            lst[i-1] = lst[i]
    del lst[-1]
    tpl = tuple(lst)
    return tpl

def compute_root(poly,x_0,numGuesses):
    epsilon = .001
    ans = []
    if abs(evalPoly(poly,x_0)) <= epsilon:
        ans.append(x_0)
        ans.append(numGuesses) 
        ans = tuple(ans)
        print ans
        return ans
    else:
        numGuesses += 1
        x_0 = x_0 - (evalPoly(poly,x_0)/evalPoly(ddx2(poly),x_0))
        compute_root(poly,x_0,numGuesses)

    compute_root(poly5,.1,1)

输出:      Samuels-MacBook:python barnicle $ python problemset2.py     (0.806790753796352,8)

这个程序(这是一个程序?)只找到一个真正的根,如果存在,但我认为它足以进行练习。

3 个答案:

答案 0 :(得分:1)

您的函数ddx2(tpl)缺少返回值。

答案 1 :(得分:0)

功能evalPoly 一旦它返回ans它永远不会返回学位:你可能想要使用return(ans,degree)

类似于in else循环

ddx2也不会返回任何函数。

答案 2 :(得分:0)

变化:

def ddx2(tpl):
    lst = list(tpl)
    for i in range(len(lst)):
        lst[i] = lst[i]*i
        if i != 0:
            lst[i-1] = lst[i]
    del lst[-1]
    tpl = tuple(lst)

要:

def ddx2(tpl):
    lst = list(tpl)
    for i in range(len(lst)):
        lst[i] = lst[i]*i
        if i != 0:
            lst[i-1] = lst[i]
    del lst[-1]
    tpl = tuple(lst)

    return tpl

缺少return

但是你还有另外一个问题,我不清楚你的意图是什么。此函数返回两次,实际只返回第一个函数(ans):

def evalPoly(poly,x):
    degree = 0
    ans = 0
    for index in poly:
        ans += (index * (x**degree))
        degree += 1
    return ans
    return degree   

您将遇到的下一个问题是达到递归限制。我建议你使用循环而不是递归来解决这个问题。