day12:闭包函数&匿名函数
闭包函数
闭包函数的定义:
如果内函数使用了外函数的局部变量
并且外函数把内函数返回出来的过程 叫做闭包
里面的内函数是闭包函数
一个简单的闭包函数示例:
- def songyunjie_family():
- father = "王健林"
- def f_hobby():
- print("这是我爸爸{}".format(father)) # 内函数使用了外函数的局部变量father
- return f_hobby # 外函数把内函数返回出来了
复杂的闭包函数(多层)
- 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) # <function mashengping_family.<locals>.big_master at 0x000001F4CB0F5620>
- # 返回的是元组
- tup = func()
- print(tup) # (<function mashengping_family.<locals>.jiejie at 0x0000013D5B175158>, <function mashengping_family.<locals>.meimei at 0x0000013D5B175268>)
- # 获取姐姐
- jiejie = tup[0]
- # 获取妹妹
- meimei = tup[1]
- # big_master 是闭包函数,是直接被mashengping_family返回出来的
- # jiejie,meimei 是通过big_master间接被返回到函数外面的
- # 调用妹妹
- meimei() # 还剩下800元
- # 调用姐姐
- jiejie() # 还剩下100元
- # 获取闭包函数所使用的变量 __closure__
- res = func.__closure__
- print(res) # (<cell at 0x000001AF2B5A76A8: function object at 0x000001AF2B645158>, <cell at 0x000001AF2B5A76D8: function object at 0x000001AF2B645268>)
- # cell_contents 用来获取单元格对象当中的闭包函数
- jiejie = res[0].cell_contents # <function mashengping_family.<locals>.jiejie at 0x0000019161005158>
- meimei = res[1].cell_contents # <function mashengping_family.<locals>.meimei at 0x0000019161005268>
- i = jiejie.__closure__[0] # <cell at 0x0000020E9B977708: int object at 0x0000000054928CD0>
- j = meimei.__closure__[0] # <cell at 0x0000020E9B977708: int object at 0x0000000054928CD0>
- a = jiejie.__closure__[0].cell_contents #
- b = meimei.__closure__[0].cell_contents #
闭包的特征
内函数使用了外函数的局部变量
那么该变量与闭包函数发生绑定
延长该变量的生命周期
- 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生命周期被延长 没有随着函数调用的结束而释放
- 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() #
- '''
- 很显然,这样是不行的,定义了全局变量100后,值就从100开始加了.
- 想一个办法,让其就算在中间插入num=100也没用
- '''
- # 解决方案
- def click_num():
- num=0
- def func():
- nonlocal num
- num+=1
- print(num)
- return func
- func = click_num()
- func() #
- func() #
- num = 1000
- func() #
- func() #
- func() #
匿名函数
匿名函数 : 用一句话来表达只有返回值的函数
语法:lambda 参数 : 返回值
目的:追求代码:简洁,高效
1.无参的lambda 表达式
- # 1.无参的lambda 表达式
- def func():
- return ""
- # 改写
- func = lambda : ""
- res = func()
- print(res)
2.有参的lambda 表达式
- # 2.有参的lambda 表达式
- def func(n):
- return type(n)
- # 改写
- func = lambda n : type(n)
- print( func([1,2,3]) )
3.带有判断条件的lambda 表达式
- def func(n):
- if n % 2 == 0:
- return "偶数"
- else:
- return "奇数"
- func = lambda n : "偶数" if n % 2 == 0 else "奇数"
- res = func(17)
- print(res)
4.三元运算符(三目运算符)
- """
- 语法:
- 真值 if 条件表达式 else 假值 如果条件表达式为真,返回真值,否则返回假值
- """
- n = 16
- res = "偶数" if n % 2 == 0 else "奇数"
- print(res)
5.小练习
- # 小练习 , 传递两个数, 返回较大的那一个
- 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)
day12:闭包函数&匿名函数的更多相关文章
- 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数
[源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...
- PHP中的闭包和匿名函数
闭包的概念是指在创建闭包时,闭包会封装周围的状态的函数.即便闭包所在环境不在了.但闭包中封装的状态依然存在. 匿名函数就是没有名称的函数. 它们看似很函数一样,实际上它们属于Closure类的实例 P ...
- 初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)
很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或 block了,而叫闭包(closure).下面配合代码来理解一下swi ...
- 闭包(匿名函数) php
php中的闭包,之前不理解.以前项目中虽然有用到,也是别人怎么用,自己也跟着怎么用,也没具体去看一下,时间长了就忘了,也不知道闭包是怎么回事.今天网上搜集了关于php闭包相关的文章,看了7,8篇,干货 ...
- 浅析PHP中的闭包和匿名函数
PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是伪装成函数的对象(Closure类的实例) .下面给大家介绍PHP中的闭包和匿名函数知识,需要的朋友参考下吧 闭包是指在创建时封 ...
- JavaScript中的闭包与匿名函数
知识内容: 1.预备知识 - 函数表达式 2.匿名函数 3.闭包 一.函数表达式 1.定义函数的两种方式 函数声明: 1 function func(arg0, arg1, arg2){ 2 // 函 ...
- PHP闭包和匿名函数
概念 闭包和匿名函数在PHP5.3.0中被引入. 闭包 闭包是指创建时封装周围环境的函数.即使闭包所在的环境不存在了,闭包中封装的状态依然存在.这个概念很难理解,不过没关系,继续看下去就会明白了. 匿 ...
- 初探swift语言的学习笔记三(闭包-匿名函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- php 回调函数结合闭包(匿名函数)的使用示例
<?php /** * php 回调函数结合闭包(匿名函数)的使用 */ function callback( $callback ){ $variable = 'program'; $ret1 ...
随机推荐
- [ C++ ] 勿在浮沙筑高台 —— 内存管理(1~8p)primitives(上)
C++ memory primitives(原语) new 若malloc失败会调用 int _callnewh(size_t t); 即调用用户设定的handler(回调函数指针),可用于内存回收防 ...
- hello python week one
python的注释 好的pytho程序员不一定非要追求 代码的简短,代码的可读性也是至关重要的 与用户交互 输入 input 会将输入内容转化为字符串 输出 print 格式化输出 %d %s 占位符 ...
- 信息收集-DNS
首先更正一个小白很普遍的错误观点,www.baidu.com(严格上是www.baidu.com. 这个点是根的意思,所有的记录从这里开始)并不是一个真正意义上的域名,而是百度服务器的A记录,baid ...
- 01[了解] Dubbo
什么是Dubbo? 概述 Dubbo是阿里巴巴内部使用的分布式业务框架,2012年由阿里巴巴开源. 由于Dubbo在阿里内部经过广泛的业务验证,在很短时间内,Dubbo就被许多互联网公司所采用,并产生 ...
- 在 Spring Boot 中使用 HikariCP 连接池
上次帮小王解决了如何在 Spring Boot 中使用 JDBC 连接 MySQL 后,我就一直在等,等他问我第三个问题,比如说如何在 Spring Boot 中使用 HikariCP 连接池.但我等 ...
- ssh -i 密钥文件无法登陆问题
一.用ssh 带密钥文件登录时候,发生以下报错 [root@99cloud1 ~]# ssh -i hz-keypair-demo.pem centos@172.16.17.104The authen ...
- python计算矩阵均匀分布程度
计算N×M(建议维度大于100*100)的0,1矩阵均匀分布程度,值由0到1表示不均匀到均匀 import numpy as np def make_rand_matrix(side=20): # 制 ...
- 双缓冲显示字幕(卡拉ok字幕)
思路: 1.设置定时器SetTime,在Ontime()里面确定显示矩形的大小,让后用DrawText把字铁道矩形上面: 2. int nTextHei = dc.GetTextExtent( m_s ...
- 最简单的jQuery轮播图(原理解析)
html: <div class="middle_right"> <div id="lunbobox"> <div id=&quo ...
- proxool配置连接池
http://log-cd.iteye.com/blog/199482 1.Hiebernate配置文件中引用proxool配置文件: <hibernate-configuration> ...