day12:闭包函数&匿名函数(lambda)

编程之家收集整理的这篇文章主要介绍了day12:闭包函数&匿名函数(lambda)编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

闭包函数

闭包函数的定义:

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

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

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

复杂的闭包函数(多层)

 mashengping_family():
    father = 马云"
    jiejie = 马蓉
    meimei = 马诺
    money =1000

     jiejie():
        nonlocal money
        money-=700
        还剩下{}元.format(money))
     meimei():
        nonlocal money
        money-=200
         big_master():
        return (jiejie,meimei)
     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. <cell at 0x0000020E9B977708: int object at 0x0000000054928CD0>

a = jiejie.__closure__[0].cell_contents  100
b = meimei. 100

闭包的特征

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

 outer(val):
     inner(num):
        return val+num
     inner

func = outer(10)  func = inner
res = func(15)  res = func(15) =inner(15)
 25
"""
10实参-->val形参
因为内函数inner是闭包函数 使用了外函数val
那么该变量val生命周期被延长 没有随着函数调用的结束而释放
res = inner(15) => return val+num =>10+15 =>25
"""

闭包的意义

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

 模拟鼠标点击次数
num = 0
 click_num():
    global num
    num += 1
    print(num)

click_num()  1
click_num()  2
click_num()  3
num = 100
click_num()  101
click_num()  102

'''
很显然,这样是不行的,定义了全局变量100后,值就从100开始加了.
想一个办法,让其就算在中间插入num=100也没用
'''

 解决方
 click_num():
    num=0
     func():
        nonlocal num
        num+=1
        (num)
     func

func = click_num()
func()  1
func()  2
num = 1000
func()  3
func()  4
func()  5

匿名函数

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

语法:lambda 参数 : 返回值

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

1.无参的lambda 表达式

 1.无参的lambda 表达式
 func():
    return 123"
    
 改写
func = lambda : 
res =print(res)

2.有参的lambda 表达式

 2.有参的lambda 表达式
 func(n):
     type(n)
    
 改写    
func = lambda n : type(n)
print(  func([1,2,3])  )

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

if n % 2 == 0:
        偶数else:
        奇数        
        
func = lambda n : " if n % 2 == 0 else 
res = func(17)
print(res)

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


语法:
    真值 if 条件表达式 else 假值  如果条件表达式为真,返回真值,否则返回假值
"""
n = 16
res = "
print(res)

5.小练习

 小练习,传递两个数,返回较大的那一个
 func(x,y):
    if x>y:
         x
     y
        
func = lambda x,y : x if x>y  y
res = func(200,100print(res)

 

总结

以上是编程之家为你收集整理的day12:闭包函数&匿名函数(lambda)全部内容,希望文章能够帮你解决day12:闭包函数&匿名函数(lambda)所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478

猜你在找的Python相关文章

Excel表操作 python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。 安装xlrd pip install xlrd 简单的表格读取
2019年7月3日早上,在百度AI开发者大会上,一个来自山西的青年,将一瓶矿泉水浇在了同样来自山西的李彦宏身上。 可以回顾一下 https://b23.tv/av57665929/p1 ,着实让人一惊
itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。 开源地址 https://github.com/littlecodersh/ItChat 文档: https://itc
Socket有一个缓冲区,缓冲区是一个流,先进先出,发送和取出的可自定义大小的,如果取出的数据未取完缓冲区,则可能存在数据怠慢。其中【recv(1024)】表示从缓冲区里取最大为1024个字节,但实际
ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射。简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。 本质上,它是一个简洁的key-value存储系统。 其主要用途有:动态数据库缓存、不同应用(语言)中共享数据 安装 安装及命令介绍
如果使用pymysql,则可以在view中直接import pymysql进行操作,与原操作无区别 Django数据库框架支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在s
使用原生SQL语句进行对数据库操作,可完成数据库表的建立和删除,及数据表内容的增删改查操作等。其可操作性很强,如可以直接使用“show databases”、“show tables”等语句进行表格之
类即是一个模型,根据模型建立起不同的对象,对象间拥有共同的一些属性 简单的类: 类变量和实例变量: 类变量: 类及所有实例共享变量,推荐使用方法是 【类名.变量名】 实例变量(self.变量名): 只
Python的进程和线程是使用的操作系统的原生线程和进程,其是去调用操作系统的相应接口实现 进程:之间不可直接共享数据,是资源的集合,进程必须有一个线程 线程:基于进程,之间可直接共享数据,可执行,只
页面跳转 页面跳转的url中必须在最后会自动添加【】,所以在urls.py的路由表中需要对应添加【】 本地跳转需要参考urls.py的路由表 Cookie 设置cookie 获取cookie 删除
存储系统数据缓存一般会使用三个模块:Mongodb,redis,memcache。其中memcache是轻量级缓存,只能将数据保存到内存中,redis可以配置数据保存在内存还是硬盘。 其主要用途有:不