Python的闭包和装饰器

Python 闭包是啥? 读懂此文,远离“闭包”烦恼!! Python 闭包 阅读详情

Python的闭包和装饰器

闭包

闭包(closure)是函数式编程的重要的语法结构,Python也支持这一特性,下面就开始介绍Python中的闭包。

首先看看闭包的概念:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,闭包是由函数和与其相关的引用环境组合而成的实体。

python函数作用域LEGB

不论在什么语言中,变量都是必不可少的,在python中,一般存在以下几个变量类型,local:函数内部作用域;enclosing:函数内部与内嵌函数之间;global:全局作用域;build-in:内置作用域。解释器在遇到变量的时候,会按照如下的顺序进行查找:L > E > G > B,简称LEGB。

Python中通过提供 namespace 来实现重名函数/方法、变量等信息的识别,其一共有三种 namespace,分别为:

local namespace: 作用范围为当前函数或者类方法

global namespace: 作用范围为当前模块

build-in namespace: 作用范围为所有模块

当函数/方法、变量等信息发生重名时,Python会按照 “local namespace -> global namespace -> build-in namespace”的顺序搜索用户所需元素,并且以第一个找到此元素的 namespace 为准。

简单闭包例子,打招呼:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/7/26 20:38
# @File    : Test4.py
"""
闭包的使用
"""

def outer(greet):
    def inner(name):
        print(greet,name)

    return inner

out = outer('你好')
out('小明')
再看:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/7/26 20:38
# @File    : Test4.py
"""
闭包的使用
"""

def outer(greet):
    def inner(name):
        print(greet,name)

    return inner

out = outer('你好')
print (dir(out))
print (out.__closure__)
print (type(out.__closure__[0]))
print (out.__closure__[0].cell_contents)
输出:
E:\Python3\python.exe E:/Python工作空间/model/close/Test4.py
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
(<cell at 0x00000218DF1055E8: str object at 0x00000218DF100DF0>,)
<class 'cell'>
你好

Process finished with exit code 0

从这里可以看到闭包的原理,当内嵌函数引用了包含它的函数(enclosing function)中的变量后,这些变量会被保存在enclosing function的__closure__属性中,成为enclosing function本身的一部分;也就是说,这些变量的生命周期会和enclosing function一样。

Python中怎么创建闭包

在Python中创建一个闭包可以归结为以下三点:
闭包函数必须有内嵌函数
内嵌函数需要引用该嵌套函数上一级namespace中的变量
闭包函数必须返回内嵌函数
通过这三点,就可以创建一个闭包,是不是想到了上一篇中介绍的Python装饰器。没错,Python装饰器就是使用了闭包。

装饰器

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能
简单装饰器:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/7/26 16:17
# @File    : Mydemo1.py

"""
简单装饰器
"""

import time

def func(func):
    def say():
        print('AOP')
        func()
    return say


@func
def Target():
    print('start')
    time.sleep(1)
    print('end')

Target()
通过@语法糖把func函数进行嵌入
再看带参数的的函数:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/7/26 16:42
# @File    : Mydemo2.py

"""
装饰器检验奇数偶数
"""

def check(func):
    def wrapper(a,b):
        res=func(a,b)
        if res % 2 == 0:
            print('偶数')
        else:
            print('奇数')

    return  wrapper

@check
def func(a,b):
    res = a+b
    return  res


func(1,2)
check函数进行奇数偶数校验
从例子中可以看到,对于被装饰函数需要支持参数的情况,我们只要使装饰器的内嵌函数支持同样的签名即可。

带参数的装饰器

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/7/26 19:51
# @File    : Mydemo3.py

"""
带参数的装饰器
"""

def check(flag=True):
    if flag:
        def _check(func):
            def wrapper(*args,**kwargs):
                res = func(*args,**kwargs)
                if res % 2 == 0:
                    print('偶数')
                else:
                    print('奇数')

            return  wrapper

    else:

        def _check(func):
            return  func
    return _check

@check(True)
def func1(a,b):
    print('执行func1')
    return a+b


@check(False)
def func2(a,b):
    print('执行func2')
    return a+b

func1(9,10)
func2(9,10)
对func1进行检验,func2则不检验
通过例子可以看到,如果装饰器本身需要支持参数,那么装饰器就需要多一层的内嵌函数
python 闭包和装饰器详解 python 闭包,装饰器 一 闭包 如果在一个函数的内部定义了另一个函数,外部的函数叫它外函数,内部的函数叫它内函数。 1 闭包条件    1 在一个外函数中定义了一个内函数。 2 内函数里运用了外函数的临时变量。 3 并且外函数的返回值是内函数的引用。 一般情况下,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包... 阅读详情

相关推荐

闭包 最详细的闭包解释 自己的私藏 简单易懂

为了分吧自己的收藏拿出来了!来自印象笔记的资料本!全程干货!前端面试最全的闭包分类!看一下 终身受益!还有其他资源!没用砍我!

Python 闭包详解

必须有一个内嵌函数。内嵌函数必须引用外部函数中的变量。外部函数的返回值必须是内嵌函数。简而言之,闭包就是由函数以及创建该函数时存在的自由变量组成的实体。闭包是Python中一个非常有用的特性,它允许函数记住其外部变量的状态,提供了一种封装数据和功能的强大方式。通过理解和掌握闭包,可以编写出更加灵活和强大的Python代码。

qq_35716085的博客 3万+

BPC坏点矫正

whatis the Bad Pixel? 坏点为死点,也就是基本不随照度变化呈现光电线性转换的关系。表现为暗态常亮,亮态常暗。 坏点分类:静态坏点:亮坏点,暗坏点。 动态坏点:在一定像素范围内,该点表现正常,而超过这一范围,该点表现的比周围像素要亮。与sensor ...

camerall 1万+

python---闭包

python装饰器重要讲解(一)

zzh_love的博客 9924

从零构建简历智能匹配系统:AI技术助力高效招聘

本文详细介绍了简历智能匹配系统的开发过程,从数据收集、预处理、特征提取到模型匹配和结果展示,每一步都提供了详细的代码实例。通过使用TF-IDF、Word2Vec和BERT等技术,我们能够有效地将求职者的简历与职位描述进行匹配,从而提高招聘效率。未来,随着自然语言处理技术的进一步发展,简历智能匹配系统将变得更加智能和高效,为企业和求职者提供更好的服务。

理论都是虚的,代码才是王道。 309

ardupilot如何让官网支持自己的硬件方案

本节主要记录ardupilot中如何让官网支持自己的硬件方案。参考1参考2。

陌城烟雨 159

Python闭包:深入理解与应用

闭包是Python函数式编程的核心概念,由内层函数及其引用的外部变量(自由变量)组成,能记住外层函数的环境。其三大要素为:函数嵌套、内层引用外层变量、外层返回内层函数。

an_yu_xin的博客 3825

【2026 Science Robotics】Learning realistic lip motions for humanoid face robots

哥伦比亚大学Yuhang Hu团队提出了一种创新方法,通过10自由度软体嘴唇设计和自监督学习算法解决仿人机器人嘴唇动作僵硬问题。研究采用变分自编码器(VAE)和面部动作Transformer(FAT)模型,将语音信号转化为机器人可执行的电机指令。实验表明,该方法在多语言测试中表现优异,用户偏好率达62.5%,显著提升了口型同步的真实感和流畅度。该成果突破了传统机械结构的限制,为跨越"恐怖谷效应"提供了有效解决方案。

志在山顶的人,不会贪念山腰的风景 308

Python 中的闭包详解

闭包是一个函数对象,它“记住”了定义该函数时,所在的作用域中的变量(自由变量)。即使这些变量的作用域已经结束,闭包仍然可以使用它们。嵌套函数。外部作用域的变量被引用。外部函数返回嵌套函数。

游客520 1706

如何使用 ESP32 CAM 进行自动车牌识别 (ANPR)

用于提取 JSON 值并在 OLED 上显示文本的函数。有一个可用的函数,即 extractJsonStringValue 来提取字符串值。它是独立函数,但您仍然可以使用一些 JSON 库来执行相同的功能。

jkh920184196的博客 1303

KNN算法

其原理是在给定的数据集中,根据某个距离度量方法,将测试数据与已知数据集中的所有数据进行距离计算,然后选取K个距离最近的数据作为测试数据的邻居,根据邻居的类别进行投票,将测试数据分类到得票最多的类别中。总之,KNN算法是一种简单而有效的分类方法,它不需要对数据进行训练,可以适用于多种数据类型和应用场景,并且可以通过调整K值或距离阈值等参数来控制算法的复杂度和性能。,KNN算法需要找到K个距离测试样本最近的训练样本,计算它们的类别,并将测试样本归入到得票最多的类别中。则取值为1,否则为0,表示邻居中属于类别。

优快云XXCQ的博客 2628

Python闭包和装饰器详解(以及区别)

闭包与装饰器

weixin_64476458的博客 8485

热力学仿真软件:ANSYS CFX_(15).旋转机械仿真

创建旋转域在中选择需要设置为旋转域的区域。选择选项。设置旋转速度在设置中,指定旋转速度(单位为弧度/秒)。也可以选择选项,并输入具体值。设置旋转轴在设置中,指定旋转轴的方向和位置。通常旋转轴的方向可以使用单位向量来表示,例如[0, 0, 1]表示沿Z轴旋转。旋转轴的位置可以通过指定一个点的坐标来确定,例如[0, 0, 0]表示旋转轴通过原点。旋转机械的仿真在ANSYS CFX中是一个复杂但重要的过程。

kkchenjj的博客 1157

Python闭包和装饰器

闭包、装饰器、无参数的装饰器、装饰器语法糖、带参数的装饰器、可组合性装饰器、装饰器工厂、类装饰器

原名又逢乱世。不要放下学习的脚步,毕竟比天天打牌、钓鱼、打游戏更能从内在充实自己。 1753

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题。可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后。登录以后,选中左侧Buckets,可以看到有自己用的桶,找到以后点击打开。显示文件展示中,文件预览失败,那么这个时候,去修改minio的配置。可以看到,点击配置管理,这里我们启用的是minio对吧。默认是没有配置的这个时候,是允许下载,但不允许预览的.

添柴程序猿的专栏 5563

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

python闭包和装饰器的区别_python中闭包和装饰器

前言:编程语言发展的过程中,我们为了提高代码利用率,发明了函数式编程。函数将代码封装起来,我们需要用到此功能函数的时候,调用一下就可以了。但是使用的过程中,也遇到了一些问题,比如函数实现的功能不够,或者跟我们要实现的功能有些差别。肿么办呢?打开函数内部代码,重新写?可以吗?可以!但是这就违背了函数式编程思想的初衷,代码没有重复利用,而且还破坏了原有函数代码。怎么办?聪明的人类思想的灯泡再次闪亮,咔...

weixin_34431283的博客 2325

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python 闭包和装饰器

python进阶知识点 闭包和装饰器

swu_Halo的博客 785

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python基础 — 闭包和装饰器

百度百科:维基百科:注意:闭包并不只是一个python中的概念,在函数式编程语言中广泛应用。哈哈看完有没有感觉云里雾里的的,看不懂对了,下面我们来拿Python中的闭包实例来感受下到底什么事闭包,在回过头来理解闭包的概念。(1)Python中闭包的特点(2)创建一个简单的闭包(3)闭包的简单应用问题:使用闭包计算一个数的 n 次幂。相信到这里,我们已经可以判断是否是闭包,自定义闭包并简单的使用闭包了,下面我们来浅析闭包的一些特性原理。(4)闭包的一些特性原理pass拓展被装饰函数功能的一种函数,可以在不改变

个人博客 1717

python——闭包、装饰器

1. 看一个闭包的实际例子: def line_conf(a, b): def line(x): return a*x + b return line line1 = line_conf(1, 1) line2 = line_conf(4, 5) print(line1(5)) print(line2(5)) 这个例子中,函数line与变量a,b构成闭包。在创建...

GC 6654

python闭包与装饰器

闭包和装饰器是 Python 中非常强大的工具,可以用于封装状态、修改函数行为、增强功能等。大家多尝试,文章只是提供思路,实践还得靠自己。【保证100%免费】

nhb687095的博客 1119

Python 闭包与装饰器

闭包是指有权访问另一个函数作用域中变量的函数。简单来说,即使该函数已经执行完毕,其作用域内的变量也不会被销毁,而是会被闭包所引用,从而可以在函数外部继续访问这些变量。

2301_78209919的博客 1111

python 闭包与装饰器的关系_Python的闭包和装饰器

什么是闭包python中函数名是一个特殊的变量,它可以作为另一个函数的返回值,而闭包就是一个函数返回另一个函数后,其内部的局部变量还被另一个函数引用。闭包的作用就是让一个变量能够常驻内存。def count():fs = []for i in range(1, 4):def f():return i*ifs.append(f)return fsf1, f2, f3 = count()>&gt...

weixin_29052717的博客 1032

Python基础:闭包和装饰器

print('昵称:两点水 部门:做鸭事业部 上班打卡成功')punch()昵称:两点水 部门:做鸭事业部 上班打卡成功然后,产品反馈,不行啊,怎么上班打卡没有具体的日期,加上打卡的具体日期吧,这应该很简单,分分钟解决啦。print('昵称:两点水 部门:做鸭事业部 上班打卡成功')punch()2018-01-09昵称:两点水 部门:做鸭事业部 上班打卡成功。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1489
上一篇: Python3操作MySql数据库
下一篇: Python单元测试模块---unittest
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值