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)

  

posted @ 2020-07-20 23:28  liyaaa  阅读(120)  评论(0编辑  收藏  举报