函数对象
Python一切皆对象,函数这一语法结构也是一个对象。函数被称为第一类对象,函数可以被当做数据传递。在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。
函数可以被赋值
执行上述代码,输出如下,请留意代码中的注释信息。
函数可以作为参数传递
执行上述代码,输出如下,请留意代码中的注释信息。
函数可以作为返回值
如上示例中,当函数(不带括号)作为返回值时,返回的是函数的内存地址,代码执行顺序及结果,如下:
将上面代码稍微改动一下,尝试让fun_b返回 return fun(),多了一个括号,代码如下:
当 执行 return fun() 时,实际上是先调用fun_a函数,再将fun_a的返回结果作为fun_c的返回,运行代码,结果如下:
闭包
Python 闭包的简单定义:
在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
我们通过下面例子简单理解一下闭包。
结合上面例子,一个闭包可以理解为调用了一个函数fun_a,这个函数fun_a返回了一个函数fun_b。这个返回的函数fun_b就叫做闭包。在调用函数fun_a的时候传递的参数a、c就是自由变量。
上面例子中,函数 fun_b 与环境变量 a,c 构成闭包。在创建闭包的时候,我们通过fun_a 的参数 a,c明确这两个环境变量的取值,因此确定了函数的最终形式(y = 2b + 10)。我们只需要变换参数a,b就可以获得不同的直线表达函数。由此,我们可以看到,闭包的引入提高代码了代码的可复用性,更加简洁。