嵌套函数
python允许创建嵌套函数。也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变。
例子:
#encoding=utf-8
def outer():
name="python"
def inner():#outer函数内部定义的函数
print name
return inner()#返回该内部函数
在inner函数中,python解析器需要找一个叫name的本地变量,查找失败后会继续在上层的作用域里面寻找,这个上层作用域定义在outer函数里,python函数可以访问封闭作用域。
return内层函数时不加括号,只返回函数的地址。
闭包函数:
如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包。闭包是Python所支持的一种特性,它让在非global scope定义的函数可以引用其外围空间中的变量,这些外围空间中被引用的变量叫做这个函数的环境变量。环境变量和这个非全局函数一起构成了闭包。
def line_conf(a, b):
def line(x):
return a * x + b
return line
嵌套函数line中的代码访问了a和b变量,line本身函数体内并不存在这两个变量,所以会逐级向外查找,往上走一层就找到了来自主函数line_conf传递的a, b。若往外直至全局作用域都查找不到的话代码会抛异常。
line_A = line_conf(2, 1) #y=2x+b
line_B = line_conf(3, 2) #y=3x+2
#打印x对应y的值
print(line_A(1)) #3
print(line_B(1)) #5
内包的语法为
def 父函数(参数): #这里的参数外部传递给子函数作其函数参数
def 子函数(参数): #这里的参数为外部传递给子函数作其自变量额值
fuction
return 子函数值
调用语法:
变量=父函数(赋给子函数的参数)
result=变量(子函数自变量的值)
result的值为子函数的计算值
在Python中,循环体内定义的函数是无法保存循环执行过程中的不停变化的外部变量
_list = []
for i in range(3):
def func(a):
return i+a
_list.append(func)
for f in _list:
print(f(1))
输出结果是3, 3, 3 。
想要让上面的代码输出1, 2, 3可以使用如下的闭包函数:
_list = []
for i in range(3):
def func(i):
def f_closure(a): # <<<---
return i + a
return f_closure
_list.append(func(i)) # <<<---
for f in _list:
print(f(1))