python--内嵌函数,内包函数

嵌套函数

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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值