python 3 函数对象与闭包使用入门
1、首先,函数在python中可以像变量一样生成,传递,赋值。函数可以嵌套定义,像变量一样有作用域。
函数对象有一些属性,比如:
__doc__可以查看函数注释,
__annotations__可以查看类型标注,
__code__可以获取code对象(可用dis查看反汇编),
__closure__可以查看闭包。


2、如图是一个嵌套的函数定义,且内层函数读取了外层函数中的x。可以看到__closure__闭包中存在一个Cell Variable,它就是对x的引用。

3、如刚才所见,python的闭包构造是将要引用的变量放在__closure__中。
因此,如下图所示的代码,所有构造的函数指向了同一个变量y(如红框所示,它们地址相同),且y的值是最终值4,所以用lambda表达式构造的这几个函数都是计算x -> x**4,而不是分别计算x**0, x**1, .... 这是一个容易犯的错误。

4、有一种work around是使用eval函数,将当前y值转化为字符串,再将整个字符串eval。但这不是一种安全的做法。

5、另一种方式是将要作为常量的值写成默认参数,如图所示。默认参数的计算会在函数构造时进行,因此每个函数有了不同的default_y。

6、同理,嵌套函数的声明当中,如果闭包中的变量是常数,也可以用默认参数代替。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
阅读量:109
阅读量:120
阅读量:80
阅读量:174
阅读量:51