2017-08-03 130 views
0

我想了解一个非常小的代码,它为我带来了很多时间,我仍然不清楚它究竟是如何工作的。从函数返回一个lambda函数

我知道lambda是如何工作的,我过去曾经使用过它们,但是这段代码对我来说有点复杂。

def demo(arg): 
    return lambda target = None: (target, arg) 

with_foo = demo({"foo": 50}) 
print with_foo() 
print with_foo({"bar": 4}) 

上述代码的输出是

(None, {'foo': 50}) 
({'bar': 4}, {'foo': 50}) 

有人能向我解释这个target变量的填充方式,我得到这个输出?

+0

它可以帮助你,这样它会创建一个正常的'def'功能,而不是一个拉姆达重新写'demo'。 –

回答

4
def demo(arg): 
    return lambda target = None: (target, arg) 

这相当于这个代码,而不是使用lambda

def demo(arg): 
    def func(target=None): 
     return (target, arg) 
    return func 

(注意target = None只是一个带有默认值参数)

所以我们有一个功能,返回另一个函数。

当你做with_foo = demo({"foo": 50}),结果是功能等同于这样的:

def with_foo(target=None): 
    return (target, {"foo": 50}) 

我希望清除的东西了!

+0

谢谢这真的帮助我理解输出的第一行,但是我仍然无法理解第二个输出。当我第二次调用这个''with_foo({“bar”:4})时,arg是{“foo”:50},目标包含'{“bar”:4}'请你解释一下这个 –

+0

如果你调用'with_foo()','target'是'None',所以结果是'(None,{“foo”:50})''。如果你调用'with_foo({“bar”:4})',那么'target'是'{“bar”:4}',所以结果是'({“bar”:4},{“foo”: 50})'。 – smarx

+0

谢谢,这真是一个很好的帮助。 –

0

你有什么你执行的第4行后相当于:

def with_foo(target=None): 
    return target, {"foo":50}