day12 闭包函数、闭包的特征、匿名函数(用一句话来表达只有返回值的函数)
# ### 闭包函数
"""
如果内函数使用了外函数的局部变量,
并且外函数把内函数返回出来的过程,叫做闭包
里面的内函数是闭包函数
"""
基本语法
def songunjie_family(): father = "王健林" def f_hobby(): print("我们先定一个小目标,比如先挣它一个亿,这是我爸爸{}".format(father)) return f_hobby func = songyunjie_family() func()
复杂版本
def mashengping_family(): father = "马云" jiejie = "马蓉" meimei = "马诺" money = 1000 def jiejie(): nonlocal money: money -= 700 print("买包包,买名表,买首饰,把钱都败光了,家里的钱还剩下{}元".format(money)) def meimei(): nonlocal money(): money -= 200 print("要找只找有钱人,宁愿坐在宝马里面哭,也不愿坐在自行车上撒欢,家里的钱都败光了还剩下{}".format(money)) def big_master(): return (jiejie,meimei) return big_master() func = mashengping_family() print(func) # 返回的是元组 tup = func() print(tup) # 获取姐姐 jiejie = tup[0] # 调用姐姐 jiejie() # ### 获取闭包函数使用的变量 __closure__ res = func.__closure__ # cell_contents 用来获取单元对象中的闭包函数 jiejie = res[0].cell_contents meimei = res[1].cell_contents
# ### 闭包的特征
"""
内函数使用了外函数的内部变量
那么该变量与闭包函数发生绑定,
延长该变量的生命周期
"""
def outer(val): del inner(num): return val + num return inner func = outer(10) # func = inner res = func(15) # res = func(15) = inner(15) print(res)
"""
10实参 -> val 形参
因为内函数inner是闭包函数,使用了外函数val
那么该变量val生命周期被延长,没有随着函数调用的结束而释放
res = inner(15) => return val + num => 10 + 15 => 25
"""
# ### 闭包的意义
模拟鼠标点击次数
num = 0 def click_num(): global num
num += 1 print(num) click_num() click_num() click_num() num = 100 click_num() click_num()
使用闭包函数改写点击次数
""" 闭包的意义: 闭包可以优先使用外函数中的变量,并对比保重的值起到了封装保护的作用,外部无法访问 """
def click_num(): num = 0 def func(): nonlocal num num += 1 if num == 6: num = 0 print(num) return func func = click_num() func() func() func() func() num = 1000 func() func() func()
# ### 匿名函数:用一句话来表达只有返回值的函数
"""语法:lambda 表达式"""
"""追求代码:简洁,高效"""
无参的lambda 表达式
def func(): return "123" # 改写 func = lambda : "123" res = func() print(res) # 有参的lambda 表达式 def func(n): return type(n) # 改写 func = lambda n : type(n) print(func[1,2,3])
# ### 三元(目)运算符
"""
语法:
真值 if 条件表达式 else 假值 如果条件表达式为真,返回真值,否则返回假值
"""
n = 16 res = "偶数" if n % 2 == else "奇数" print(res) # 带有判断条件的lambda 表达式 def func(): if n % 2 == 0: return "偶数" else: return "奇数" func = lambda n : "偶数" if n % 2 == 0 else "奇数" res = func(17) print(res)
小练习,传递两个数,返回较大的那一个
def func(x,y): if x>y: return x else: return y func = lambda x,y : x if x>y else y res = func(200,100) print(res)