day12:闭包函数&匿名函数(lambda)

day12:闭包函数&匿名函数(lambda),第1张

概述闭包函数 闭包函数的定义: 如果内函数使用了外函数的局部变量并且外函数把内函数返回出来的过程 叫做闭包里面的内函数是闭包函数 一个简单的闭包函数示例: def songyunjie_family():

闭包函数

闭包函数的定义:

如果内函数使用了外函数的局部变量
并且外函数把内函数返回出来的过程 叫做闭包
里面的内函数是闭包函数

一个简单的闭包函数示例:

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)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1190145.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存