python函数自我嵌套 python嵌套语句( 二 )


在Python语言中, 函数也是对象,它可以被创建、赋值给变量,或者作为函数的返回值 。我们来看下面这个例子 。
在上述代码中 , 在函数gen_greet内部定义了inner_func函数,并返回了一个inner_func函数对象 。外部函数gen_greet返回了一个函数对象,所以像gen_greet这样的函数也叫工厂函数 。
在内部函数inner_func中,使用了外部函数的传参greet_words(非局部变量),以及函数的参数name(局部变量) , 来打印一个字符串 。
接下来,调用gen_greet("Hello")创建一个函数对象say_hello,紧接着调用say_hello("Mr. Zhang"),输出的结果为:Hello, Mr. Zhangpython函数自我嵌套!
同样的,调用gen_greet("Hi")创建一个函数对象say_hi,调用say_hello("Mr. Zhang") , 输出的结果为:Hi,Tony!
我们可以发现,gen_greet返回的函数对象具有记忆功能,它能够把所需使用的非局部变量保存下来,用于后续被调用的时候使用 。这种保存了非局部变量的函数对象被称作闭包(closure) 。
那么闭包是如何实现的呢?其实并不复杂,函数对象中有一个属性__closure__,它就是在创建函数对象时用来保存这些非局部变量的 。
__closure__属性是一个元组或者None类型 。在上述代码中,我们可以通过下面方式查看:
函数的嵌套所实现的功能大都可以通过定义类的方式来实现,而且类是更加面向对象的代码编写方式 。
嵌套函数的一个主要用途是实现函数的装饰器 。我们看下面的代码:
在上述代码中,logger函数返回函数with_logging,with_logging则是打印了函数func的名称及传入的参数,然后调用func, 并将参数传递给func 。其中的@wraps(func)语句用于复制函数func的名称、注释文档、参数列表等等,使得with_logging函数具有被装饰的函数func相同的属性 。
代码中接下来用@logger对函数power_func进行修饰 , 它的作用等同于下面的代码:
可见,装饰器@符其实就是上述代码的精简写法 。
通过了解了嵌套函数和闭包的工作原理,我们在使用过程中就能够更加得心应手了 。
python 函数嵌套函数a返回的是一个函数对象,c = a(3)那么c是一个函数b对象 , 可以调用,c(2)则调用此函数,函数的内容是计算x+y然后返回 , x来自于外层闭包a(3)中的参数3,y来自于c(2)中的参数2,故2+3=5,返回5 。
python函数自我嵌套的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python嵌套语句、python函数自我嵌套的信息别忘了在本站进行查找喔 。

推荐阅读