2017-08-03 159 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}