为啥这个 python 闭包不起作用?

Posted

技术标签:

【中文标题】为啥这个 python 闭包不起作用?【英文标题】:Why doesn't this python closure work?为什么这个 python 闭包不起作用? 【发布时间】:2013-10-31 23:46:30 【问题描述】:

试图让工作函数 evaluate_poly(poly,x_n) 和 compute_deriv2(poly,x_n) 在函数 compute_root(poly,x_n,epsilon) 内工作

代码运行,没有抛出任何错误,但没有返回任何内容。 这是代码

# 6.00 Problem Set 2
#
# Successive Approximation
#

def evaluate_poly(poly, x_n):
    """
    Computes the polynomial function for a given value x. Returns that value.

    Example:
    >>> poly = (0.0, 0.0, 5.0, 9.3, 7.0)    # f(x) = 7x^4 + 9.3x^3 + 5x^2
    >>> x = -13
    >>> print evaluate_poly(poly, x)  # f(-13) = 7(-13)^4 + 9.3(-13)^3 + 5(-13)^2
    180339.9

    poly: tuple of numbers, length > 0
    x: number
    returns: float
    """
    valHolder=0
    for i in range((0),(len(poly))):
        valHolder=valHolder+(poly[i])*(x_n** i)
    return float(valHolder)

def compute_deriv(poly):
    """
    Computes and returns the derivative of a polynomial function. If the
    derivative is 0, returns (0.0,).

    Example:
    >>> poly = (-13.39, 0.0, 17.5, 3.0, 1.0)    # x^4 + 3x^3 + 17.5x^2 - 13.39
    >>> print compute_deriv(poly)        # 4x^3 + 9x^2 + 35^x
    (0.0, 35.0, 9.0, 4.0)

    poly: tuple of numbers, length > 0
    returns: tuple of numbers
    """
    newList=list(poly)
    for i in range((0),(len(poly))):
        ##if i > 0.0:
        a=newList[i]
        b=i

        if b == 0:
            continue
        else:
            derivedNumber=a*b
        newList.append(derivedNumber)

    finishedTuple=tuple(newList)
    return finishedTuple[len(poly):]
    print "FINISHED TUPLE IS= ",finishedTuple

def compute_deriv2(poly,x_n):
    """
    Similar to first compute_deriv, this time takes a value for x

    """
    newList=list(poly)
    for i in range((0),(len(poly))):
        ##if i > 0.0:
        a=newList[i]
        b=i

        if b == 0:
            continue
        else:
            derivedNumber=a*b
        newList.append(derivedNumber)

    finishedTuple=tuple(newList[len(poly):])
    derivedValue=0
    for g in range((0),len(finishedTuple)):
        c=finishedTuple[g]
        d=g
        derivedValue+=c*(x_n**d)
    return derivedValue




def compute_root(poly, x_n, epsilon):
    """
    Uses Newton's method to find and return a root of a polynomial function.
    Returns a tuple containing the root and the number of iterations required
    to get to the root.

    Example:
    >>> poly = (-13.39, 0.0, 17.5, 3.0, 1.0)    #x^4 + 3x^3 + 17.5x^2 - 13.39
    >>> x_0 = 0.1
    >>> epsilon = .0001
    >>> print compute_root(poly, x_0, epsilon)
    (0.80679075379635201, 8.0)

    poly: tuple of numbers, length > 1.
         Represents a polynomial function containing at least one real root.
         The derivative of this polynomial function at x_0 is not 0.
    x_0: float
    epsilon: float > 0
    returns: tuple (float, int)
    """
    evaluate_poly(poly,x_n)
    compute_deriv2(poly,x_n)
    newList=list(poly)

这是我使用的输入。

>>>>compute_root((-13.39,0.0,17.5,3.0,1.0),0.1,0.0001)

当我自己调用它们时,所有单独的函数都可以工作,除了 compute_root 一个。知道我应该如何关闭它以使其工作吗?我是否必须在 compute_root 函数中再次定义它们?

【问题讨论】:

你不应该用compute_root返回一些东西吗? “没有返回任何内容”可能是因为compute_root 没有返回语句... 其实None is returned应该是正确答案。 这和闭包有什么关系? 这里没有闭包。 【参考方案1】:

compute_root 中没有返回

    e = evaluate_poly(poly,x_n)
    c = compute_deriv2(poly,x_n)
    newList=list(poly)
    return e, c # or whatever you want

【讨论】:

酷。确保您选择一个答案作为您接受的答案。【参考方案2】:

是的,不会引发任何错误,但您不会在 compute_root 中返回任何内容。这意味着这些函数的返回值:

evaluate_poly(poly,x_n)
compute_deriv2(poly,x_n)

被简单地忽略。此外,由于默认情况下不返回任何内容的函数会返回 None,因此请执行以下操作:

print compute_root(...)

将不可避免地打印None

要解决此问题,请在 compute_root 中添加一个返回语句,以返回您想要的结果。我不知道这到底是什么,但可以举个例子:

a = evaluate_poly(poly,x_n)
b = compute_deriv2(poly,x_n)
c = newList=list(poly)
return a, b, c

【讨论】:

以上是关于为啥这个 python 闭包不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 Python“循环代码”不起作用?

Python:为啥这个程序不起作用?

为啥这个来自 python 的 bash 调用不起作用?

PYTHON:简单的浮点转换不起作用,为啥?

为啥这个信号/槽代码不起作用

为啥这个 Django 日志记录不起作用?