闭包函数
闭包函数的定义:
如果内函数使用了外函数的局部变量
并且外函数把内函数返回出来的过程 叫做闭包
里面的内函数是闭包函数
一个简单的闭包函数示例:
def songyunjIE_family(): father = "王健林" f_hobby(): print(这是我爸爸{}".format(father)) @H_419_38@# 内函数使用了外函数的局部变量father return f_hobby 外函数把内函数返回出来了
复杂的闭包函数(多层)
mashengPing_family(): father = 马云" jIEjIE = 马蓉 meimei = 马诺 money =1000 jIEjIE(): nonlocal money money-=700 还剩下{}元.format(money)) meimei(): nonlocal money money-=200 big_master(): return (jIEjIE,meimei) big_masterfunc = mashengPing_family()print(func) <function mashengPing_family.<locals>.big_master at 0x000001F4CB0F5620> 返回的是元组tup = func()print(tup) (<function mashengPing_family.<locals>.jIEjIE at 0x0000013D5B175158>,<function mashengPing_family.<locals>.meimei at 0x0000013D5B175268>) 获取姐姐jIEjIE = tup[0] 获取妹妹meimei = tup[1] big_master 是闭包函数,是直接被mashengPing_family返回出来的# jIEjIE,meimei 是通过big_master间接被返回到函数外面的 调用妹妹meimei() 还剩下800元 调用姐姐jIEjIE() 还剩下100元 获取闭包函数所使用的变量 __closure__res = func.__closure__print(res) (<cell at 0x000001AF2B5A76A8: function object at 0x000001AF2B645158>,<cell at 0x000001AF2B5A76D8: function object at 0x000001AF2B645268>) cell_contents 用来获取单元格对象当中的闭包函数jIEjIE = res[0].cell_contents <function mashengPing_family.<locals>.jIEjIE at 0x0000019161005158>meimei = res[1].cell_contents <function mashengPing_family.<locals>.meimei at 0x0000019161005268>i = jIEjIE.__closure__[0] <cell at 0x0000020E9B977708: int object at 0x0000000054928CD0>j = meimei. <cell at 0x0000020E9B977708: int object at 0x0000000054928CD0>a = jIEjIE.__closure__[0].cell_contents 100b = meimei. 100
闭包的特征
内函数使用了外函数的局部变量
那么该变量与闭包函数发生绑定
延长该变量的生命周期
outer(val): inner(num): return val+num innerfunc = outer(10) func = innerres = func(15) res = func(15) =inner(15) 25"""10实参-->val形参因为内函数inner是闭包函数 使用了外函数val那么该变量val生命周期被延长 没有随着函数调用的结束而释放res = inner(15) => return val+num =>10+15 =>25"""
闭包的意义
闭包的意义:闭包可以优先使用外函数中的变量,并对闭包中的值起到了封装保护的作用,外部无法访问
模拟鼠标点击次数num = 0 click_num(): global num num += 1 print(num)click_num() 1click_num() 2click_num() 3num = 100click_num() 101click_num() 102'''很显然,这样是不行的,定义了全局变量100后,值就从100开始加了.想一个办法,让其就算在中间插入num=100也没用''' 解决方案 click_num(): num=0 func(): nonlocal num num+=1 (num) funcfunc = click_num()func() 1func() 2num = 1000func() 3func() 4func() 5
匿名函数
匿名函数 : 用一句话来表达只有返回值的函数
语法:lambda 参数 : 返回值
目的:追求代码:简洁,高效
1.无参的lambda 表达式
1.无参的lambda 表达式 func(): return 123" 改写func = lambda : res =print(res)
2.有参的lambda 表达式
2.有参的lambda 表达式 func(n): type(n) 改写 func = lambda n : type(n)print( func([1,2,3]) )
3.带有判断条件的lambda 表达式
if n % 2 == 0: 偶数else: 奇数 func = lambda n : " if n % 2 == 0 else res = func(17)print(res)
4.三元运算符(三目运算符)
语法: 真值 if 条件表达式 else 假值 如果条件表达式为真,返回真值,否则返回假值"""n = 16res = "print(res)
5.小练习
小练习,传递两个数,返回较大的那一个 func(x,y): if x>y: x y func = lambda x,y : x if x>y yres = func(200,100print(res)
总结
以上是内存溢出为你收集整理的day12:闭包函数&匿名函数(lambda)全部内容,希望文章能够帮你解决day12:闭包函数&匿名函数(lambda)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)