Python中的闭包

文章介绍了闭包的概念,包括其定义、条件和创建方法。通过示例展示了如何使用闭包创建一元线性函数,并讨论了闭包中对外部函数变量的修改以及可能遇到的陷阱,如引用滞后问题。最后,提到了使用nonlocal关键字解决闭包中变量修改的问题。
摘要由CSDN通过智能技术生成

目录

闭包的定义:

闭包的条件

创建一个闭包函数:

闭包的应用(使用闭包来创建一个一元线性函数)

测试是否可以对外部函数进行修改

闭包的陷阱:

关于闭包的总结:


闭包的定义:

一个函数定义中引用了函数定义以外的函数变量,并且该函数可以在函数定义外执行

闭包的条件

1.必须是一个内嵌函数(函数里定义的函数)---这对应函数之间的嵌套

2.内嵌函数必须引用一个定义在闭包范围内(外部函数里)的变量 --- 内部函数引用外部变量

3.外部函数必须返回内嵌函数---必须返回那个内嵌函数

创建一个闭包函数:

 def fun_a(num_a):    #创建一个内嵌函数fun_a()



    def fun_b(num_b):     #内嵌函数引用外部变量

        print("内嵌函数fun_b的参数是:%s,外部函数fun_a的参数是:%s"%(num_b,num_a))

        return  num_a+num_b



    return fun_b    #返回内嵌函数fun_b



result = fun_a(10)   #给fun_a传参10

print(result(100))   #给函数fun_a的内嵌函数传参100

# print(result(200))

闭包的应用(使用闭包来创建一个一元线性函数)

def create_line(a,b):

    def line1(x):

        return a*x+b

    return line1

l1 = create_line(3,5)

l2 = create_line(6,7.2)

print(l1(2))

print(l2(5))

测试是否可以对外部函数进行修改

def test1():

    count = 1

    def add():

        print(count)

        count+=1

    return add



print(test1()())

说明:这里的报错说明这个本地count变量,不能在引用之前被修改

要想解决上面的问题可以使用下面的办法:

因为这里的count变量被当作了本地变量,而实际上该变量是介于本地变量和全局变量之间的变量,要想修改外部变量可以将该变量使用nonlocal标识(谁使用谁标识,这里在add中使用,所以在add函数里标识),就可以进行修改了修改如下:

闭包的陷阱:

def hs():

    fun_list = []

    for i in range(1,3):

        def pf():

            return i**2


        fun_list.append(pf)

    return fun_list

fun1,fun2 = hs()

print(fun1(),fun2())

运行结果如下:

说明:如果运行正确的话,运行结果应该是1和4,因为分别是1的平方和2的平方,但是这里出现的结果是两个4,出现这种情况的原因是因为在创建函数fun1和fun2的时候,这里的pf函没有调用继续调用,一直到i=2的时候才开始调用,所以导致fun1和fun2所使用的参数i都等于2,也就导致最后输出的结果是两个4,要想解决这个问题,就要在返回pf的时候对i进行调用,就可以解决这个问题,代码如下

 

说明:这里的p1就是对i的调用,这样就会防止上一步的等到最后一个函数返回的时候才进行调用

关于闭包的总结:

闭包其实就是一个函数内嵌在另一个函数内,并且这个内嵌函数可以在函数外被调用,而且该内嵌函数必须被返回。

以上的观点仅是个人观点,如有不足,请各位大佬在评论区里指出,如果对你有帮助,请记得收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值