python-闭包函数_匿名函数_装饰器

闭包函数

1. 闭包函数

闭包函数的概念:

​ 如果内函数使用了外函数的局部变量,

​ 并且外函数把内函数返回出来的过程,叫做闭包

​ 里面的内函数是闭包函数

基本语法

def xiaoming_family():
	father = "王健林"
	def f_hobby():
		print("我们先定一个小目标,比如赚它一个亿,这是我爸爸{}".format(father))
	return f_hobby

func = xiaoming_family()
func()

obj = func.__closure__[0]
print(obj.cell_contents)

复杂版本

def xiaoma_family():
	father = "马云"
	jiejie = "马蓉"
	meimei = "马诺"
	money = 1000

	def jiejie():
		nonlocal money
		money -= 600
		print("买包包,买口红,买首饰,把钱都败光了,家里还剩下{}万".format(money))
		
	def meimei():
    	nonlocal money
    	money -= 300
    	print("只找有钱人,宁愿坐在宝马里面哭,也不愿意在自行车上撒欢,家底都被掏空了还剩下{}万".format(money))
    	
    def father():
    	return (jiejie,meimei)
   
	return father	
	
func = xiaoma_family()
print(func)
# 返回的是元组
tup = func() # father()
print(tup)   # tup = (jiejie,meimei)
# 获取姐姐
jiejie = tup[0] # jiejie 函数
# 获取妹妹
meimei = tup[1] # meimei 函数
"""
father 是闭包函数,是直接被xiaoma_family返回出来的
jiejie,meimei 是通过father间接被返回到函数外面的
"""
# 调用妹妹
meimei() # 调用妹妹函数
# 调用姐姐
jiejie() # 调用姐姐函数

"""获取闭包函数使用的变量 __closure__"""
res = func.__closure__
print(res)
"""cell_contents 用来获取单元格对象当中的闭包函数"""
jiejie = res[0].cell_contents
meimei = res[1].cell_contents
"""通过获取单元格对象 -> 获取单元格对象中的内容 -> 实际的调用"""
jiejie()
meimei()
print(jiejie.__closure__[0].cell_contents)
print(meimei.__closure__[0].cell_contents)

2. 闭包的特征

闭包的特征:

​ 内函数使用了外函数的局部变量

​ 那么该变量与闭包函数发生绑定

​ 延长该变量的生命周期

def outer(val):
	def 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的生命周期被延长,没有随着函数调用的结束而释放
func(15) 把15这个参数赋值给num这个形参
res = inner(15) => return val + num => 10 + 15 = 25
"""

3. 闭包的意义

闭包的意义:

​ 闭包可以优先使用外函数中的变量,并对闭包中的值起到了封装保护的作用,外部无法访问

# 模拟鼠标点击次数
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
		print(num)
	return func	

func = click_num()
func()
func()
func()
num = 1000
func()
func()
func()

4. 匿名函数

语法 : lambda 参数 : 返回值

特点 : 追求代码简洁 , 高效

  1. 无参的 lambda 表达式
def func():
	return "123abc"
res = func()
print(res)

# 改写
func = lambda : "123abc"
res = func()
print(res)
  1. 有参的 lambda 表达式
def func(n):
	return n
res = func([1,2,3])	
print(res)

# 改写
func = lambda n : n
res = func([1,2,3])
print(res)
  1. 带有判断条件的 lambda 表达式
def func(n):
	if n % 2 == 0:
		return "偶数"
	else:
		return "奇数"
res = func(10)
print(res)

# 改写
func = lambda n : "偶数" if n % 2 == 0 else "奇数"
res = func(17)
print(res)

"""
三元(三目)运算符
语法:
	真值 if 条件表达式 else 假值  ->  如果条件表达式为真,返回真值,否则返回假值
"""
n = 16
res = "偶数" if n % 2 == 0 else "奇数"
print(res)

# 小练习 : 传递两个数,返回较大的那一个
def func(x,y):
	if x > y:
		return x
	else:
		return y
res = func(-8,6)
print(res)

# 改写
func = lambda x,y : x if x > y else y
res = func(100,-82)
print(res)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I believe I can fly~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值