多语言展示
当前在线:1363今日阅读:61今日分享:18

python 3 函数对象与闭包使用入门

本经验介绍在python 3 的编程当中,函数对象的使用,以及简单闭包的构造方法与注意事项。
工具/原料
1

python 3

2

VSCode

方法/步骤
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

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

注意事项

如果遇到问题,可以在下面提出疑问。

推荐信息