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 ...
随机推荐
- Cannot instantiate the type Map
今天在使用Map中犯了个低级错误,记录一下: 打算使用map为一个视频List观看记录的统计标识,key为vid,value默认为false,当该key已经统计,标识value为true,初始实例化M ...
- Newtonsoft 六个超简单又实用的特性,值得一试 【下篇】
一:讲故事 上一篇介绍的 6 个特性从园子里的反馈来看效果不错,那这一篇就再带来 6 个特性同大家一起欣赏. 二:特性分析 1. 像弱类型语言一样解析 json 大家都知道弱类型的语言有很多,如: n ...
- 腾讯IEG--2020春招实习
笔试 正常批就五道编程题,可以跳出使用本地IDE,题目很好理解,基本都能写出来,但是要过全部用例不容易.具体题目和题解可以看看这位大佬的牛客帖子,我的就不献丑了,有两题都只过了40%,我当时是用C#做 ...
- Flask01-HelloWorld
# flask学习 参考:http://www.pythondoc.com/flask-mega-tutorial/ ## python3. 默认支持虚拟环境使用(用最简单的方法,解决问题) wget ...
- Asp.net Core AOP实现(采用Autofac)
引用正确的库来实现AOP 新的.NET Core是基于.NET Standard的..所以我们在引用库的时候特别要注意相关的兼容问题. 在传统的ASP.NET中,使用过Autofac来进行AOP操作的 ...
- JavaScript基础函数的属性:记忆模式(019)
函数在Javascript里是有属性的,因为它们是一种特殊对象.事实上,就算是没有明确声明,函数在最初就已经包含了一些固有的属性,比如所有函数都length这个属性,它可以指出函数声明了多少个参数: ...
- MySQL 前期准备
一.数据库的基本概念 数据库的英文单词:DataBase,简称:DB. 数据库:用于存储和管理数据的仓库. 数据库的特点: 持久化存储数据的.其实数据库就是一个文件系统,是以文件的方式存在服务器的电脑 ...
- vue页面数据强制更新渲染
vue数据更新会出现缓存的情况,几种方式可以让数据实时渲染到页面: 1.简单粗暴的方式 this.$forceUpdate();//强制更新 2.增减元素 splice() push() 3. ...
- call,apply,bind的内部原理实现
call call 方法使用一个函数执行的时候更改本身 this 指向,并传入一个或者多个参数. var obj = { name: '$call' } function _fun() { conso ...
- TallestCow
简单解说 建立差分数组. 以最高的牛为高度基点,假设牛A和牛B能相互看见,就把牛A和牛B中间的牛高度都-1 最后对每头牛直接计算输出即可. 需要注意的是他给出的关系中:两头牛的顺序可能是颠倒的,而且关 ...