闭包函数

闭包函数的定义:

如果内函数使用了外函数的局部变量
并且外函数把内函数返回出来的过程 叫做闭包
里面的内函数是闭包函数

一个简单的闭包函数示例:

  1. def songyunjie_family():
  2. father = "王健林"
  3. def f_hobby():
  4. print("这是我爸爸{}".format(father)) # 内函数使用了外函数的局部变量father
  5. return f_hobby # 外函数把内函数返回出来了

复杂的闭包函数(多层)

  1. def mashengping_family():
  2. father = "马云"
  3. jiejie = "马蓉"
  4. meimei = "马诺"
  5. money =1000
  6.  
  7. def jiejie():
  8. nonlocal money
  9. money-=700
  10. print("还剩下{}元".format(money))
  11. def meimei():
  12. nonlocal money
  13. money-=200
  14. print("还剩下{}元".format(money))
  15. def big_master():
  16. return (jiejie,meimei)
  17. return big_master
  18.  
  19. func = mashengping_family()
  20. print(func) # <function mashengping_family.<locals>.big_master at 0x000001F4CB0F5620>
  21.  
  22. # 返回的是元组
  23. tup = func()
  24. print(tup) # (<function mashengping_family.<locals>.jiejie at 0x0000013D5B175158>, <function mashengping_family.<locals>.meimei at 0x0000013D5B175268>)
  25.  
  26. # 获取姐姐
  27. jiejie = tup[0]
  28. # 获取妹妹
  29. meimei = tup[1]
  30.  
  31. # big_master 是闭包函数,是直接被mashengping_family返回出来的
  32. # jiejie,meimei 是通过big_master间接被返回到函数外面的
  33.  
  34. # 调用妹妹
  35. meimei() # 还剩下800元
  36. # 调用姐姐
  37. jiejie() # 还剩下100元
  38.  
  39. # 获取闭包函数所使用的变量 __closure__
  40. res = func.__closure__
  41. print(res) # (<cell at 0x000001AF2B5A76A8: function object at 0x000001AF2B645158>, <cell at 0x000001AF2B5A76D8: function object at 0x000001AF2B645268>)
  42.  
  43. # cell_contents 用来获取单元格对象当中的闭包函数
  44. jiejie = res[0].cell_contents # <function mashengping_family.<locals>.jiejie at 0x0000019161005158>
  45. meimei = res[1].cell_contents # <function mashengping_family.<locals>.meimei at 0x0000019161005268>
  46.  
  47. i = jiejie.__closure__[0] # <cell at 0x0000020E9B977708: int object at 0x0000000054928CD0>
  48. j = meimei.__closure__[0] # <cell at 0x0000020E9B977708: int object at 0x0000000054928CD0>
  49.  
  50. a = jiejie.__closure__[0].cell_contents #
  51. b = meimei.__closure__[0].cell_contents #

闭包的特征

内函数使用了外函数的局部变量
那么该变量与闭包函数发生绑定
延长该变量的生命周期

  1. def outer(val):
  2. def inner(num):
  3. return val+num
  4. return inner
  5.  
  6. func = outer(10) # func = inner
  7. res = func(15) # res = func(15) =inner(15)
  8. print(res) #
  9. """
  10. 10实参-->val形参
  11. 因为内函数inner是闭包函数 使用了外函数val
  12. 那么该变量val生命周期被延长 没有随着函数调用的结束而释放
  13. res = inner(15) => return val+num =>10+15 =>25
  14. """

闭包的意义

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

  1. # 模拟鼠标点击次数
  2. num = 0
  3. def click_num():
  4. global num
  5. num += 1
  6. print(num)
  7.  
  8. click_num() #
  9. click_num() #
  10. click_num() #
  11. num = 100
  12. click_num() #
  13. click_num() #
  14.  
  15. '''
  16. 很显然,这样是不行的,定义了全局变量100后,值就从100开始加了.
  17. 想一个办法,让其就算在中间插入num=100也没用
  18. '''
  19.  
  20. # 解决方案
  21. def click_num():
  22. num=0
  23. def func():
  24. nonlocal num
  25. num+=1
  26. print(num)
  27. return func
  28.  
  29. func = click_num()
  30. func() #
  31. func() #
  32. num = 1000
  33. func() #
  34. func() #
  35. func() #

匿名函数

匿名函数 : 用一句话来表达只有返回值的函数

语法:lambda 参数 : 返回值

目的:追求代码:简洁,高效

1.无参的lambda 表达式

  1. # 1.无参的lambda 表达式
  2. def func():
  3. return ""
  4.  
  5. # 改写
  6. func = lambda : ""
  7. res = func()
  8. print(res)

2.有参的lambda 表达式

  1. # 2.有参的lambda 表达式
  2. def func(n):
  3. return type(n)
  4.  
  5. # 改写
  6. func = lambda n : type(n)
  7. print( func([1,2,3]) )

3.带有判断条件的lambda 表达式

  1. def func(n):
  2. if n % 2 == 0:
  3. return "偶数"
  4. else:
  5. return "奇数"
  6.  
  7. func = lambda n : "偶数" if n % 2 == 0 else "奇数"
  8. res = func(17)
  9. print(res)

4.三元运算符(三目运算符)

  1. """
  2. 语法:
  3. 真值 if 条件表达式 else 假值 如果条件表达式为真,返回真值,否则返回假值
  4. """
  5. n = 16
  6. res = "偶数" if n % 2 == 0 else "奇数"
  7. print(res)

5.小练习

  1. # 小练习 , 传递两个数, 返回较大的那一个
  2. def func(x,y):
  3. if x>y:
  4. return x
  5. else:
  6. return y
  7.  
  8. func = lambda x,y : x if x>y else y
  9. res = func(200,100)
  10. print(res)

day12:闭包函数&匿名函数的更多相关文章

  1. 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

    [源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...

  2. PHP中的闭包和匿名函数

    闭包的概念是指在创建闭包时,闭包会封装周围的状态的函数.即便闭包所在环境不在了.但闭包中封装的状态依然存在. 匿名函数就是没有名称的函数. 它们看似很函数一样,实际上它们属于Closure类的实例 P ...

  3. 初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)

    很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或 block了,而叫闭包(closure).下面配合代码来理解一下swi ...

  4. 闭包(匿名函数) php

    php中的闭包,之前不理解.以前项目中虽然有用到,也是别人怎么用,自己也跟着怎么用,也没具体去看一下,时间长了就忘了,也不知道闭包是怎么回事.今天网上搜集了关于php闭包相关的文章,看了7,8篇,干货 ...

  5. 浅析PHP中的闭包和匿名函数

    PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是伪装成函数的对象(Closure类的实例) .下面给大家介绍PHP中的闭包和匿名函数知识,需要的朋友参考下吧   闭包是指在创建时封 ...

  6. JavaScript中的闭包与匿名函数

    知识内容: 1.预备知识 - 函数表达式 2.匿名函数 3.闭包 一.函数表达式 1.定义函数的两种方式 函数声明: 1 function func(arg0, arg1, arg2){ 2 // 函 ...

  7. PHP闭包和匿名函数

    概念 闭包和匿名函数在PHP5.3.0中被引入. 闭包 闭包是指创建时封装周围环境的函数.即使闭包所在的环境不存在了,闭包中封装的状态依然存在.这个概念很难理解,不过没关系,继续看下去就会明白了. 匿 ...

  8. 初探swift语言的学习笔记三(闭包-匿名函数)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  9. php 回调函数结合闭包(匿名函数)的使用示例

    <?php /** * php 回调函数结合闭包(匿名函数)的使用 */ function callback( $callback ){ $variable = 'program'; $ret1 ...

随机推荐

  1. [ C++ ] 勿在浮沙筑高台 —— 内存管理(1~8p)primitives(上)

    C++ memory primitives(原语) new 若malloc失败会调用 int _callnewh(size_t t); 即调用用户设定的handler(回调函数指针),可用于内存回收防 ...

  2. hello python week one

    python的注释 好的pytho程序员不一定非要追求 代码的简短,代码的可读性也是至关重要的 与用户交互 输入 input 会将输入内容转化为字符串 输出 print 格式化输出 %d %s 占位符 ...

  3. 信息收集-DNS

    首先更正一个小白很普遍的错误观点,www.baidu.com(严格上是www.baidu.com. 这个点是根的意思,所有的记录从这里开始)并不是一个真正意义上的域名,而是百度服务器的A记录,baid ...

  4. 01[了解] Dubbo

    什么是Dubbo? 概述 Dubbo是阿里巴巴内部使用的分布式业务框架,2012年由阿里巴巴开源. 由于Dubbo在阿里内部经过广泛的业务验证,在很短时间内,Dubbo就被许多互联网公司所采用,并产生 ...

  5. 在 Spring Boot 中使用 HikariCP 连接池

    上次帮小王解决了如何在 Spring Boot 中使用 JDBC 连接 MySQL 后,我就一直在等,等他问我第三个问题,比如说如何在 Spring Boot 中使用 HikariCP 连接池.但我等 ...

  6. ssh -i 密钥文件无法登陆问题

    一.用ssh 带密钥文件登录时候,发生以下报错 [root@99cloud1 ~]# ssh -i hz-keypair-demo.pem centos@172.16.17.104The authen ...

  7. python计算矩阵均匀分布程度

    计算N×M(建议维度大于100*100)的0,1矩阵均匀分布程度,值由0到1表示不均匀到均匀 import numpy as np def make_rand_matrix(side=20): # 制 ...

  8. 双缓冲显示字幕(卡拉ok字幕)

    思路: 1.设置定时器SetTime,在Ontime()里面确定显示矩形的大小,让后用DrawText把字铁道矩形上面: 2. int nTextHei = dc.GetTextExtent( m_s ...

  9. 最简单的jQuery轮播图(原理解析)

    html: <div class="middle_right"> <div id="lunbobox"> <div id=&quo ...

  10. proxool配置连接池

    http://log-cd.iteye.com/blog/199482 1.Hiebernate配置文件中引用proxool配置文件: <hibernate-configuration> ...