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)
    

      

  • 相关阅读:
    hiveserver2 with kerberos authentication
    python Basic usage
    python Quicksort demo
    Python HeapSort
    mrunit for wordcount demo
    CCDH证书
    Hadoop question list
    Hadoop Yarn core concepts
    Hadoop Resource
    Hadoop could not find or load main class
  • 原文地址:https://www.cnblogs.com/liya1014/p/13352477.html
Copyright © 2011-2022 走看看