2016-10-22 22 views
0

我是学装饰的概念蟒蛇从以下链接:python中的装饰器,它们如何生成函数?

http://www.python-course.eu/python3_decorators.php

我在它下面的代码片段一个基本的疑问:

def f(x): 

    def g(y): 
     return y + x + 3 
    return g 

nf1 = f(1) 

nf2 = f(3) 

print(nf1(1)) 

print(nf2(1)) 

在这个页面中,写成最后两行的输出分别为'5'和'7'。 但是,正如我所看到的,我们只传递'x'的值,它从哪里得到'y'的值?它如何为'Y'赋值来计算输出?

+0

这些是关闭,而不是装饰。装饰器将*函数*作为参数,并根据输入返回一个新函数。闭包(大致)是一个函数,它可以在定义的范围内“记住”局部变量的值。这两个概念相关,因为装饰器通常会返回一个调用原始函数的闭包。 – chepner

+0

也就是说,'g'是一个闭包,'f'只是一个返回闭包的函数。 – chepner

回答

1

函数f创建并返回一个名为g的新函数。

因此,该代码通过传递x=1x=3创建两个g功能:

nf1 = f(1) 

nf2 = f(3) 

然后g功能(存储在nf1nf2)被调用的参数y=1

print(nf1(1)) 

print(nf2(1)) 

也许(或者可能不),如果他们写出了相同的结果,这将更容易理解:

print(f(1)(1)) # x=1, y=1 
print(f(3)(1)) # x=3, y=1 
+0

你能否澄清一下为什么y = 1? –

+0

@itpdusra'nf1' **是**'g',因为'f'返回'g'。函数'g'带有一个参数:'y',所以'nf1'只有一个参数:'y',因为'nf1'是'g'。我期望这部分更容易理解;)真正棘手的问题是'nf1'和'nf2'具有不同的'x'值,当它们都是'g'时。为此,阅读[关于闭包的这个答案]可能会很好(http://stackoverflow.com/a/4020443/389289)(尽管这是一个更高级的话题)。 – zvone