2.闭包nonlacal标识的使用

文章目录
前言
学习笔记 (仅供学习使用)
一、闭包
这里闭包需要有三个条件
三个条件 , 缺一不可:
1)必须有一个内嵌函数(函数里定义的函数)——这对应函数之间的嵌套
2)内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量——内部函数引用外部变量
3)外部函数必须返回内嵌函数——必须返回那个内部函数
def func_a(number_a):#高阶函数 , 主要目的是为了返回一个函数def fun_b(number_b):print('内嵌函数fun_b的参数是:%s---外部函数fun_a的参数是:%s'%(number_b,number_a))return number_a + number_breturn fun_bresult = func_a(10)# print(result)#.fun_b at 0x7fb53f1f8670>print(result(20))#run:#内嵌函数fun_b的参数是:20---外部函数fun_a的参数是:10#30# fun_b即使闭包 。'''一个函数引用了函数外的一个变量其次 , 该函数可在其定义范围之外被执行 。'''
二、闭包的具体应用 1.bibao
'''闭包的应用'''def crate_line(a,b):def line(x):return a*x + breturn line#这里的line就是闭包#de到一个一元线性函数 。l1 = crate_line(1,2)l2 = crate_line(2,-3)# print(l1,l2)#.line at 0x7fd9a1c05790> .line at 0x7fd9a1c05820>#计算当x=5时 , 线一的y值y = l1(3)print(y)#5y = l2(3)print(y)#3
1.闭包似优化了变量 , 原来需要类对象完成的?作 , 闭包也可以完成
2.由于闭包引?了外部函数的局部变量 , 则外部函数的局部变量没有及时释放 , 消耗内存
2.闭包标识的使用
我们知道 , 函数内部函数 , 引用外部函数参数或值 , 进行内部函数运算执行 , 并不是完全返回一个函数 , 也有可能是一个在外部函数的值 , 我们还需要知道返回的函数不会立刻执行 , 而是直到调用了函数才会执行
'''2、闭包里面修改外部变量的值 。'''def test1():#c是局部变量和全局变量之间的一种变量,需要加上 , nonlocal的标识 。c = 0def add():print(c)c += 1return add# print(test1())#.add at 0x7f9b24305a60>此时得到的是add函数 , add里面的内容并为执行 , 所以未报错# print(test1()())#UnboundLocalError: local variable 'c' referenced before assignment此时执行的是add函数的内容所以报错 。def test2():#c是局部变量和全局变量之间的一种变量,需要加上 , nonlocal的标识 。c = 0def add():nonlocal cprint(c)c += 1return creturn addprint(test2()())#0#1
3.闭包的陷井
【2.闭包nonlacal标识的使用】'''3、闭包的陷进 , 容易出错的地方 。'''def test3():func_list = []for i in range(1,4):def test4():return i**2func_list.append(test4)return func_listf1,f2,f3 = test3()print(f1(),f2(),f3())#9 9 9 这就是闭包的陷井 , test4一直到75行(就这一行)才得到调用 , 所以都为3的平方 。def test5():func_list = []for i in range(1,4):def test6(_i = i):return _i**2# 这里的_i不会随着test6的调动而改变 。_i的值是定值 。func_list.append(test6)return func_listf1,f2,f3 = test5()print(f1(),f2(),f3())#1 4 9