zoukankan      html  css  js  c++  java
  • 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)
    

      

  • 相关阅读:
    ACM第六周竞赛题目——A LightOJ 1317
    数学概念——J
    数学概念——I
    数学概念——D 期望
    数学概念——A 几何概型
    数学概念——E 期望(经典问题)
    数学概念——F 概率(经典问题)birthday paradox
    数学概念——H 最美素数
    数学概念——G 最大公约数
    UVa1328
  • 原文地址:https://www.cnblogs.com/liya1014/p/13352477.html
Copyright © 2011-2022 走看看