python 闭包 closure 总结

2023-12-29 02:32
文章标签 python 总结 闭包 closure

本文主要是介绍python 闭包 closure 总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.内嵌函数的非本地变量

在另一个函数里面定义的函数,被称为内嵌函数。内嵌函数可以访问闭合范围内(就是外部函数范围)的变量,这些变量被称为非本地变量(nonlocal variable)。
默认情况下,非本地变量是只读的。为了可以修改非本地变量,需要将它们生命为nonlocal,如下例所示。

def print_msg(msg):
"""This is the outer enclosing function"""def printer():
"""This is the nested function"""
print(msg)printer()# We execute the function
# Output: Hello
print_msg("Hello")

可以看到,内嵌函数是printer(),可以访问非本地变量msg,msg定义在外部函数print_msg()里面。

2.定义一个闭包函数

在上面的例子中,如果print_msg()返回print()函数,而不是调用它,会发生什么?这要求函数被这样定义

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def print_msg(msg):
"""This is the outer enclosing function"""def printer():
"""This is the nested function"""
print(msg)return printer # this got changed# Now let's try calling this function.
# Output: Hello
another = print_msg("Hello")
another()

这非同寻常。
print_msg()函数被通过传入“Hello”所调用,返回的函数被绑定为another. 在调用another()的时候,我们对print_msg()函数已经完成调用了,但是“Hello”仍然被记住了!

这种将一些数据(“Hello”)附加到代码的技术,被称为python里面的closure.

闭合范围内的数据(非本地变量)能够一直被记住,即便它们已经脱离了闭合范围或者外部函数已经被从命名空间删除.

在python shell里面继续运行下面的代码,看看会发生什么.

>>> del print_msg
>>> another()
Hello
>>> print_msg("Hello")
Traceback (most recent call last):
...
NameError: name 'print_msg' is not defined

3.怎样得到一个闭包函数?

从上面的例子可以看出,当我们让内嵌函数引用一个非本地变量,就得到了一个python closure.
python closure必须满足以下三点标准:
1)必须有一个内嵌函数(函数里定义的函数)
2)内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量
3)外部函数必须返回内嵌函数

4.什么时候使用closure?

closure适合做什么?
closure可以减少使用全局变量和提供一定程度的数据隐藏.

当一个类只有很少的方法(通常是一个),closure可以提供一种更优雅的替代方案。但如果类的属性或者方法开始增多,最好还是实现一个类。

下面是一个closure也许比类更好的一个例子。当然,到底哪个更好最终还是取决与你。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def make_multiplier_of(n):def multiplier(x):return x * nreturn multiplier# Multiplier of 3
times3 = make_multiplier_of(3)# Multiplier of 5
times5 = make_multiplier_of(5)# Output: 27
print(times3(9))# Output: 15
print(times5(3))# Output: 30
print(times5(times3(2)))

python的装饰器可以扩展closure的功能,详情戳这里.

5.获取闭合数值

最后还有一个友情提示,所有在外部函数定义的非本地变量,都可以被获取到。

所有的函数对象都有一个__ closure__属性,如果它是一个闭包函数,那么它包含一个cell objects元组。
就上面的例子,我们知道time3和times5是闭包函数

>>> make_multiplier_of.__closure__
>>> times3.__closure__
(<cell at 0x0000000002D155B8: int object at 0x000000001E39B6E0>,)
cell object有cell_contents属性,保存了闭合数值>>> times3.__closure__[0].cell_contents
3
>>> times5.__closure__[0].cell_contents
5

这篇关于python 闭包 closure 总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/548084

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000