如何编写带有外部变量的函数?

4

我希望你能帮忙。 我正在寻找一种编写后插入一个项目的函数的方法。 让我举个例子:

def general_poly(L):
        """ 
        L, a list of numbers (n0, n1, n2, ... nk)
        Returns a function, which when applied to a value x, returns the value 
        n0 * x^k + n1 * x^(k-1) + ... nk * x^0 
        """
        x = 1
        res = 0
        n = len(L)-1
        for e in range(len(L)):
            res += L[e]*x**n
            n -= 1
        return res

我原以为只需在此处给 x 赋值,一旦执行 general_poly(L)(10),它就会被替换为 x = 10,但显然这并不容易。我需要改变/添加什么才能使函数正常运行?函数如何知道乘法是 x?感谢你们的帮助!


1
如果x是全局变量,你需要通过global x显式地告诉Python。 - Christian Dean
2个回答

8

您被要求返回一个函数,但是您返回了计算后的值:

def general_poly(L):
    """ 
    L, a list of numbers (n0, n1, n2, ... nk)
    Returns a function, which when applied to a value x, returns the value 
    n0 * x^k + n1 * x^(k-1) + ... nk * x^0 
    """
    def inner(x):
        res = 0
        n = len(L)-1
        for e in range(len(L)):
            res += L[e]*x**n
            n -= 1
        return res
    return inner

现在 general_poly(L)(10)会执行您期望的操作,但如果将其分配给一个值,则可能更有用,因此它可以被多次调用,例如:
L = [...]
fn = general_poly(L)
print(fn(10))
print(fn(3))

您可以将 inner 重写为以下内容:
def general_poly(L):
    return lambda x: sum(e*x**n for n, e in enumerate(reversed(L)))

确实实现了我的需求,谢谢。但我还是有点糊涂:inner 的返回值基本上是将设置返回,以便一旦给定 x,就可以解决内部函数。这正确吗?如果是这样,那么 general_poly(L) 如何知道 x 是在 general_poly 的定义之后呢?因为 inner 被定义为 inner(x) - Mickey Mahoney
是的,general_poly 是一个带有一个参数 (L) 的函数,它返回一个带有一个参数 (x) 的函数。显然,参数的实际名称并不重要。 - AChampion
L仍然可以被inner()访问的事实被称为闭包。 - AChampion
你为什么想要将inner重写为一个lambda函数呢? - wwii
因为该函数现在只是一行代码,而且没有真正的必要给它命名,因为你只是返回它。这只是一种风格问题,我可以接受别人有不同的观点。 - AChampion

0
def general_poly (L):
    """ L, a list of numbers (n0, n1, n2, ... nk)
    Returns a function, which when applied to a value x, returns the value 
    n0 * x^k + n1 * x^(k-1) + ... nk * x^0 """

    def inner(x):
        L.reverse()
        return sum(e*x**L.index(e) for e in L)
    return inner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接