day12. 闭包
一、概念
"""
如果内函数使用了外函数的局部变量,
并且外函数把内函数返回出来的过程,叫做闭包
里面的内函数是闭包函数
"""
二、基本语法
def songyunjie_family():
father = "王健林"
def f_hobby():
print("我们先顶一个小目标,比如赚它一个亿,这是我爸爸{}".format(father))
return f_hobby func = songyunjie_family()
func() obj = func.__closure__[0]
print(obj.cell_contents,"<111>")
三、复杂版本
def mashengping_family():
father = "马云"
jiejie_name = "马蓉"
meimei_name = "马诺"
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() # big_master()
print(tup) # tup = (jiejie,meimei)
# 获取姐姐
jiejie = tup[0] # jiejie 函数
# 获取妹妹
meimei = tup[1] # meimei 函数 # big_master 是闭包函数,是直接被mashengping_family返回出来的
# jiejie,meimei 是通过big_master间接被返回到函数外面的
# 调用妹妹
meimei() # 调用妹妹函数
# 调用姐姐
jiejie() # 调用姐姐函数 #看它是不是闭包函数,是就可以用
# cell获取单元格对象结果是一个函数名
# 加() 运行
# ### 获取闭包函数使用的变量 __closure__
res = func.__closure__
print(res,"<222>")
# cell_contents 用来获取单元格对象当中的闭包函数
jiejie = res[0].cell_contents
meimei = res[1].cell_contents # 通过获取单元格对象 -> 获取单元格对象中的内容 -> 实际的调用
jiejie()
meimei() print(jiejie.__closure__[0].cell_contents)
print(meimei.__closure__[0].cell_contents)
四、闭包的特征和意义
1、特征
"""
内函数使用了外函数的局部变量
那么该变量与闭包函数发生绑定,
延长该变量的生命周期
"""
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生命周期被延长,没有随着函数调用的结束而释放.
func(15) 把15这个参数赋值给num这个形参
res = inner(15) => return val + num =>10 + 15 => 25
"""
2、意义
引入:
# 模拟鼠标点击次数
num = 0
def click_num():
global num
num += 1
print(num) click_num()
click_num()
click_num()
num = 100
click_num()
click_num()
2.1 使用闭包函数改写点击次数
闭包的意义:闭包可以优先使用外函数中的变量,并对闭包中的值起到了封装保护的作用.外部无法访问.
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()
func()
func()
五、匿名函数
用一句话来表达只有返回值的函数
"""语法:lambda 参数 : 返回值 """
"""追求代码:简洁,高效"""
1、无参的lambda表达式
def func():
return "" # 改写
func = lambda : ""
res = func()
print(res)
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) # ### 三元(目)运算符
"""
语法:
真值 if 条件表达式 else 假值 如果条件表达式为真,返回真值,否则返回假值
"""
n = 16
res = "偶数" if n % 2 == 0 else "奇数"
print(res)
4、小练习:传递两个数, 返回较大的那一个
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)
六、练习
#下面代码成立么?如果不成立为什么报错?怎么解决?
#
# a = 2
# def wrapper():
# print(a)
# wrapper() #
# a = 2
# def wrapper():
# a += 1
# print(a)
# wrapper() #
# a = 2
# def wrapper():
# global a
# a += 1
# print(a)
# wrapper() #
# def wrapper():
# a = 1
# def inner():
# print(a)
# inner()
# wrapper() #
# def wrapper():
# a = 1
# def inner():
# a += 1
# print(a)
# inner()
# wrapper() #
# def wrapper():
# a = 1
# def inner():
# nonlocal a
# a += 1
# print(a)
# inner()
# wrapper()

# a = 2
# def wrapper():
# print(a)
# wrapper() # 成立
1

# a = 2
# def wrapper():
# a += 1
# print(a)
# wrapper()
# 不成立 局部变量不能修改全局变量
# 解决:
# a = 2
# def wrapper():
# global a
# a += 1
# print(a)
# wrapper()
2

# a = 2
# def wrapper():
# global a
# a += 1
# print(a)
# wrapper()
# 成立
3

# def wrapper():
# a = 1
# def inner():
# print(a)
# inner()
# wrapper()
# 成立
4

# def wrapper():
# a = 1
# def inner():
# a += 1
# print(a)
# inner()
# wrapper()
# 不成立
# 要通过 nonlocal引入 a
# def wrapper():
# a = 1
# def inner():
# nonlocal a
# a += 1
# print(a)
# inner()
# wrapper()
5

def wrapper():
a = 1
def inner():
nonlocal a
a += 1
print(a)
inner()
wrapper()
# 成立
6
day12. 闭包的更多相关文章
- day12闭包,装饰器
一.闭包:内部函数引用了外部函数的变量. # f1() #闭包的定义 #内部的函数引用了外部函数的变量 # def f1(b): #闭包的常用状态 # def f2(): # print(b) # r ...
- day12 python函数名的应用 闭包 迭代器
day12 python 一.函数名的应用(是第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 def func(): print('i am funct ...
- python学习day12 函数Ⅳ (闭包&内置模块)
函数Ⅳ (闭包&内置模块) 1.内置函数(补充) lambda表达式也叫匿名函数. 函数与函数之间的数据互不影响,每次运行函数都会开一个辟新的内存. item = 10 def func(): ...
- day12 函数的嵌套调用 闭包函数,函数对象
函数嵌套: 函数嵌套: 嵌套指的是,一个物体包含另一个物体,函数嵌套就是一个函数包含另一个函数 按照函数的两个阶段 嵌套调用 指的是在函数的执行过程中调用了另一个函数,其好处可以简化外层大函数的代码, ...
- 【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器
1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 def func(): print("你吃了么?") # print(func) # a = func # ...
- Python之函数2 嵌套,作用域和闭包(Day12)
一.函数对象 1.函数是第一类对象,即函数可以当做数据传递 1.1 可以被引用 1.2 可以当做参数传递 1.3 返回值可以是函数 1.4 可以当做容器类型的元素 二.函数的嵌套 1.函数嵌套的调用: ...
- day12:闭包函数&匿名函数
闭包函数 闭包函数的定义: 如果内函数使用了外函数的局部变量并且外函数把内函数返回出来的过程 叫做闭包里面的内函数是闭包函数 一个简单的闭包函数示例: def songyunjie_family(): ...
- day12 函数嵌套
day12 函数嵌套 一. args与kwargs def index(a,b,c): print(a,b,c) def wrapper(*args,**kwargs): # args=(1,2,3) ...
- 《Web 前端面试指南》1、JavaScript 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
随机推荐
- django开发自动化测试平台简介
Django的优点 1:功能完善.要素齐全:自带大量常用工具和框架(比如分页,auth,权限管理), 适合快速开发企业级网站. 2:完善的文档:经过十多年的发展和完善,Django有广泛的实践案例和完 ...
- [设计模式]工厂方法模式(Factory Method)
模式目的 定义一个用于创建对象的接口,让其子类来决定实例化哪个类. 工厂方法模式将类的实例化延迟到了子类中进行. 模式结构 组成部分 产品(Product) - 定义了产品功能的接口 具体产品(Con ...
- CSS(二)- 选择器 - 伪元素和伪类(思维导图)
伪元素 伪元素可以创建一些文档语言无法创建的虚拟元素.比如:文档语言没有一种机制可以描述元素内容的第一个字母或第一行,但伪元素可以做到(::first-letter.::first-line).同时, ...
- day02 java学习
Java三大版本 Write once,Run anywhere. (基于JVM虚拟机) JavaSE 标准版 JavaME 嵌入式开发 JavaEE 企业级开发 Java三大名词 JDK Java开 ...
- MYSQL 之 JDBC(十五):数据库连接池
在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 在主程序(如servlet.bean)中建立数据库连接 进行sql操作 断开数据库连接 这种模式开发存在各种各样的问题,最重要的是:数 ...
- CSS 三大特性 层叠 继承 优先级
css三大特性 层叠性: 如果一个属性通过两个相同选择器设置到同一个元素上,相同的属性就会出现冲突,那么这个时候一个属性就会将另一个属性层叠掉,采用的是就近原则 继承性: 子标签会继承父标签的某些样式 ...
- Cordova总是弹出Connection to server was Unsuccessful
开发环境:Cordova版本:6.x 安卓版本:6.0 解决方案一: 在config.xml中添加以下内容: <preference name="LoadUrlTimeoutValue ...
- (6)webpack使用babel插件的使用
为什么要使用babel插件? 首先要了解babel插件是干嘛的,随着js的语法规范发展,出现了越来越多的高级语法,但是使用webpack打包的时候,webpack并不能全部理解这些高级语法,需要我们使 ...
- 洛谷 P5022 旅行
今天换标题格式了,因为感觉原版实在有点别扭…… 还是直接上题板,看完题再讲吧: 对了有个小细节没说,m一定是等于n或者等于n-1的. 这题是2018年提高组的真题哦!被我肝了2天肝出来了,2天……(真 ...
- 【java面试】- 集合篇
Java 集合概览 从下图可以看出,在Java中除了以Map结尾的类之外, 其他类都实现了Collection接口.并且,以Map结尾的类都实现了Map接口 List.Set.Map三者的区别 Lis ...