【问题标题】:How to write function with variable from the outside?如何用外部变量编写函数?
【发布时间】:2017-03-11 22:30:43
【问题描述】:

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

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?谢谢你们的帮助,伙计们!

【问题讨论】:

  • 如果x 是全局的,你需要通过global x 明确告诉Python。

标签: python function scope definition


【解决方案1】:

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

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 的 def 之后出现的?因为 inner 是 def as inner(x)?
  • 是的,general_poly 是一个参数 (L) 的函数,它返回一个接受一个参数 (x) 的函数。显然参数的实际名称无关紧要。
  • L 仍然可以被inner() 访问的事实称为闭包。
  • 为什么要将inner重写为一个lambda函数??
  • 因为函数现在只是一个单行函数,而且事实上给函数命名并没有真正的价值,因为你只是返回它。这是风格问题,我同意其他人有不同意见。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2019-10-05
    • 2020-10-30
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多