功能制作

ceo*_*com 4 python functional-programming

嗨,我是函数式编程的新手.我做的是

>>> g=lambda x:x*2
>>> f=g
>>> g=lambda x:f(f(x))
>>> g(9)
36
Run Code Online (Sandbox Code Playgroud)

现在,它不是g作为一个非终止递归函数创建的- g(x)转换为一个给出结果的新函数g(g(x)).

>>> f=g
>>> g=lambda x:f(f(x))
>>> f(8)
RuntimeError: maximum recursion depth exceeded
Run Code Online (Sandbox Code Playgroud)

根据g(x)的第一个定义,我希望g将其转换为一个给出结果的函数g(g(g(x))).为什么不呢?是否有可能以g(g(g(...(g(x))....)))这种方式创建一个导致一定次数迭代的新函数?

Eri*_*ric 6

当你f = g第二次这样做时,f变成了lambda x: f(x).闭包是按名称创建的,而不是按值创建的.


使用辅助函数变得容易:

def compose(f, g):
    return lambda x: f(g(x))

square = lambda x:x*2
g = square
for i in xrange(4):
    g = compose(g, square)
Run Code Online (Sandbox Code Playgroud)

  • 只是通过名字来说闭包只会有点误导.如果您有多个具有相同名称的变量,则闭包将始终引用创建闭包时在范围内的变量,而不仅仅是具有相同名称的任何变量.我建议将其改为"封闭变量,而不是值". (3认同)