初学者python笔记(装饰器、高阶函数、闭包)

python的高级4——闭包、装饰器 本文介绍了Python中的闭包和装饰器概念。闭包是指内部函数引用外部函数变量的结构,具有保存状态和数据隐藏的作用。装饰器是闭包的特殊应用,通过接受函数作为参数并返回新函数来扩展功能,使用@语法简化调用。文章详细讲解了闭包和装饰器的特点、实现方式、常见应用场景及注意事项,并分析了两者关系:装饰器建立在闭包基础上,专门用于函数行为修改。最后介绍了内置装饰器如@property、@classmethod的使用方法。 阅读详情

一个函数被定义完成后,甚至程序发布后,后期可能需要添加某些功能,但是我们不可能每次都去修改原函数的代码,这时候装饰器就可以上场了,本篇文章将会用一个个可实现的代码,由浅入深、循序渐进得阐述装饰器的强大之处

装饰器定义、作用、原则:
  1. 定义: 一个装饰函数的函数,即为其他函数添加附加功能
  2. 作用: 给函数添加新功能,但是原来的函数代码不会被更改
  3. 原则: 不修改被修饰函数的源代码,不修改被修饰函数的调用方式
装饰器=高阶函数+函数嵌套+闭包
  1. 高阶函数: 函数接收的参数是一个函数名 或者 函数的返回值是一个函数名

  2. 未使用装饰器:

import time
def test(s):
    start_time = time.time()
    res = 0
    for i in s:
        time.sleep(0.1)  #沉睡10秒
        res += i
    stop_time = time.time()
    print('函数的运行时间是{}秒'.format(stop_time - start_time))
    return res
print(test(range(100)))  #运行函数,传入一个从0到100的范围

运行结果:
函数的运行时间是10.012572765350342秒
4950

  1. 高阶函数:
import time
def foo():
    time.sleep(3)
    print('大海如此宽广,总有一天你会遇见真心的伙伴')
def test(func):  #传入的参数是一个函数,即为高阶函数
    print(func)  #输出函数的内存地址
    func()  #调用形参函数
test(foo)  #调用高阶函数

运行结果:
<function foo at 0x02BF7B70>
大海如此宽广,总有一天你会遇见真心的伙伴

  1. 带修饰的高阶函数(不修改原函数源代码):
import time
def foo():
    time.sleep(3)
    print('大海如此宽广,总有一天你会遇见真心的伙伴')
def test(func):  #传入的参数是一个函数,即为高阶函数
    start_time = time.time()
    print(func)  #输出函数的内存地址
    func()  #调用形参函数
    stop_time = time.time()
    print('函数运行时间为 %s' %(stop_time - start_time))
test(foo)  #调用高阶函数

运行结果:
<function foo at 0x004DC5D0>
大海如此宽广,总有一天你会遇见真心的伙伴
函数运行时间为 3.0281732082366943

  1. 带修饰的高阶函数(不修改原函数调用方式):
import time
def foo():
    time.sleep(3)
    print('大海如此宽广,总有一天你会遇见真心的伙伴')
def test(func):  #传入的参数是一个函数,即为高阶函数
    return func  #函数的返回值为函数名,也称为高阶函数
foo = test(foo)  #用foo接收test运行的返回值
foo()

运行结果:
大海如此宽广,总有一天你会遇见真心的伙伴

  1. 不修改源代码也不修改调用方式:
import time
def foo():
    time.sleep(3)
    print('大海如此宽广,总有一天你会遇见真心的伙伴')
def timmer(func):  #作为一个修饰函数
    start_time = time.time()
    func()
    stop_time = time.time()
    print('函数运行时间为 %s' %(stop_time - start_time))
    return func  #函数的返回值为函数名,也称为高阶函数
foo = timmer(foo)  #将原函数名作为接收的变量,被修饰后,就不会修改原函数的调用方式
foo()
#这样调用后,其实是会连带被修饰的结果一起输出,因为上一句赋值时已经调用了修饰函数

运行结果:
大海如此宽广,总有一天你会遇见真心的伙伴
函数运行时间为 3.018172264099121
大海如此宽广,总有一天你会遇见真心的伙伴

但是这样,它仅仅用了高阶函数,还是满足不了装饰器的功能,因为它多运行了一步

  1. 函数嵌套:
    一个函数里定义多个函数(这里需要用到函数作用域和函数嵌套的知识,在我的这篇文章里有从浅入深的详细分析:初学者python笔记(函数))
def father(name):
    #name = '白胡子_1'  #三个地方对局部变量的修改
    def son():
        #name = '白胡子_2'
        def grandson():
            #name = '白胡子_3'
            print('我的老爹是{}'.format(name))  #离它最近的局部变量的修改
        grandson()  
    son()  #运行嵌套函数
father('白胡子')
#里面的变量是一个一个层级的关系,从形参,可以一直传到底层的函数中再调用

运行结果:
我的老爹是白胡子

  1. 基本装饰器的实现(带语法糖):
import time
def timmer(func):
    def wrap():
        start_time = time.time()  #给装饰器加的功能
        func()  #在装饰器中运行函数
        stop_time = time.time()
        print('函数运行了{}秒'.format(stop_time - start_time))
    return wrap  #函数的返回值是函数,所以为高阶函数
@timmer  #语法糖的使用,使原函数即foo函数被装饰。相当于foo = timmer(foo)语句
def foo():
    time.sleep(3)
    print('test函数运行完毕!')
    
foo()  #运行原函数,方式不变,满足原则

运行结果:
test函数运行完毕!
函数运行了3.0251729488372803秒

  1. 能得到原函数返回值的装饰器:
import time
def timmer(func):
    def wrap():
        start_time = time.time()  #给装饰器加的功能
        res = func()  #在装饰器中运行函数,并且用一个变量来接收以返回原函数的返回值
        stop_time = time.time()
        print('函数运行了{}秒'.format(stop_time - start_time))
        return res  #返回原函数的返回值
    return wrap  #函数的返回值是函数,所以为高阶函数
@timmer  #语法糖的使用,使原函数即foo函数被装饰。相当于foo = timmer(foo)语句
def foo():
    time.sleep(3)
    print('test函数运行完毕!')
    return '这是test的返回值'  #为了实现把原函数的返回值也接收到
    
foo()  #运行原函数,方式不变,满足原则
print(foo())  #输出原函数的返回值

运行结果:
test函数运行完毕!
函数运行了3.0211730003356934秒
test函数运行完毕!
函数运行了3.0581750869750977秒
这是test的返回值

以上就是从装饰器的基本原理一步一步剖析,直到一个装饰器的实现,理解起来并不难。基本原理清楚了,想要深入一步学习装饰器的话,下一篇文章:初学者python笔记(装饰器后篇:登陆验证)中还有案例分析

Python闭包(Closure)与装饰器(Decorator)入门指南 本文详细介绍了Python中的闭包和装饰器,这两个特性在提升代码可重用性和可维护性方面具有重要作用。闭包是指函数能够记住并访问其词法作用域中的变量,即使函数在其原始作用域之外执行。装饰器则是一种高阶函数,接受函数作为参数并返回函数,用于在不修改原函数代码的情况下扩展其功能。文章深入解析了闭包的基本概念、与普通函数的对比以及典型应用,如计数器和函数工厂模式。同时,全面剖析了装饰器的基本语法、与直接函数调用的对比、带参数的装饰器及其应用场景。此外,还探讨了闭包与装饰器的结合应用,如函数执行时间统计和缓存装饰器实 阅读详情

相关推荐

抖音用户评论和ID的采集方法

随着5G时代的普及,各大运营商的套餐纷纷推出,使得流量成本进一步降低。同时5G线路高宽带、低延迟的技术特性和手机普及,让视频用户访问量快速增加。 由于大量的视频工具和拍摄APP的提供,让短视频的拍摄、制作包括发行都变得更加简单便捷,越来越多的普通人可以投入视频创作,创造了更丰富的互联网内容,视频作者从视频推广中能获取粉丝和推广收益。 目前抖音就是目前最重要的短视频平台之一,要及时获取上面的用户评论和ID,需要结合爬虫代理实现采集方案,下面的代码就能快速采集相关信息: package htmlunit; i

ssbt_2020的博客 6787

python3用装饰器计算函数运行时间

# 装饰器计算函数运行时间 def timeCalc(func): import time def run(*args, **kwargs): start = time.time() func(*args, **kwargs) print("程序的运行时间为: {}".format(time.time() - start)) ...

weixin_43690548的博客 1062

2025年从零开始:构建你的首个ComfyUI工作流-ComfyUI入门教程

然而,由于它拥有众多的插件节点,以及较为复杂的操作流程,学习起来相对困难。以前面搭建的文生图工作流为例,首先点击功能区的【保存】,然后你的浏览器会出来一个弹窗,你可以进行文件命名,点击确定后浏览器会下载该文件,也就是带“json”后缀的文件,这样我们的工作流就打包成一份文件了。思考一下前面说的,节点是不是需要下载安装才能使用,而我们复用别人的工作流,他用的节点你不一定下载了,因为目前有600多个节点,你不可能全部下载了吧,所以我们日后使用别人的工作流,你会经常出现这样的问题。

weixin_59486588的博客 1455

python之高阶函数、装饰器、闭包

函数即变量 定义一个函数就是把函数体给函数名。变量先定义后使用,函数一定要先声明后调用,只要声明后调用即可,哪个先定义哪个后定义没有关系。如图所示: 高阶函数 所谓高阶函数就是1. 把一个函数名当作实参传给另一个参数;2.把函数作为结果值返回。 1. 传入参数 # 高阶函数 import time def a(): time.sleep(2) print("hello,I am ...

不服输的南瓜的博客 373

电流舵DAC设计(一)

如果分辨率继续增加,温度计码译码逻辑成为面积的主要决定因素,数字版图面积增加,总的面积消耗成上升趋势。缺点是:对于高分辨率的 DAC,高位码元和低位码元权重相差很大,当输入码元转换时(以 8 位二进制型 DAC 为例)尤其是中码转换(从 01111111 转换到 10000000),因为此时电流源的选通动作并非理想情况下的绝对一致等因素,导致在极短的时间内,码元会从 01111111 跳转到 11111111 再跳到10000000,这个过程中所有开关都参与转换,会引起最大幅度的尖峰毛刺(glitch);

模拟芯片设计 2872

STM32实战:手把手教你移植CanFestival协议栈(附完整代码)

本文提供了一份详尽的STM32平台移植CanFestival协议栈的实战指南。文章从工程搭建、定时器驱动、CAN硬件适配到对象字典配置,手把手讲解核心步骤,并附完整代码示例。重点剖析了时间管理、报文收发等关键环节的实现与常见问题解决方案,旨在帮助开发者深入理解并成功实现CANopen通信。

kiwi8的博客 274

Python 中的高阶函数与闭包

python高阶函数和闭包

燕鹏 1188

【人工智能】人工智能基础概念、流派、发展史

人工智能初衷就是让计算机能够像人类一样具有自我思考、自我学习、自我决策的能力。依据百度百科上对人工智能定义:人工智能是研究、开发用于模拟、扩展和延伸人的智能的理论、方法、技术及应用系统的一门新的技术学科。人工智能是研究使计算机来模拟人的某些思维过程和智能行为的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。

WEL测试 1882

Python闭包和装饰器

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

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

2023年LitCTF web组wp

1、导弹迷踪2、1zjs3、php是世界上最好的语言!!4、Ping5、我Flag呢?7、作业管理系统8、Vim yyds10、这是什么?SQL!注一下!11、Flag点击就送!12、就当无事发生13、彩蛋。

m0_74160536的博客 1591

手把手教你学Simulink--复杂环境适应的四足机器人领域仿真建模实例:构建一个基于Simulink的四足机器人动态平衡保持仿真模型

通过上述步骤,你可以构建一个基本的基于Simulink的四足机器人动态平衡保持仿真模型。此模型不仅有助于理解四足机器人在复杂环境中的动态平衡控制原理,也为进一步优化提供了基础。随着技术的发展,还可以探索更多高级功能,如自适应步态调整、强化学习等,以提高机器人的智能性和适应性。

MHD0815的博客 236

Python中的函数进阶:闭包函数、Lambda函数、高阶函数与装饰器

简单来说,闭包函数是一个函数,它引用了其外部作用域中的变量,即使外部函数已经执行完毕,闭包函数依然可以访问这些局部变量。高阶函数是指一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数。Python中的很多内置函数都是高阶函数,比如。它需要一个二元函数和一个序列,并将二元函数应用于序列的前两个元素,然后将结果与序列的下一个元素应用同样的函数,依此类推。是一个带参数的装饰器工厂函数,它返回一个实际的装饰器。函数对序列的每个元素应用一个函数,并返回一个新的迭代器,其中包含应用函数后的结果。

Luzem0319的博客 874

基于Simulink的固态变压器(SST)多级协同控制​

本文介绍了基于Simulink的固态变压器(SST)多级协同控制方法。SST作为智能电网关键设备,其三级架构(AC-DC整流、DC-DC隔离、DC-AC逆变)存在级间耦合问题。文章提出纵向解耦与横向联动相结合的协同控制策略,详细推导了各级控制算法,并通过Simulink实现了10kV/400V级联型SST系统建模。仿真结果显示,在±20%电网波动和0-100%负载跳变下,系统能保持直流母线电压波动<2%。文章还提供了工程部署建议和代码生成方法,为SST的研发提供了实用指导。

amy_mhd的博客 301

Python笔记三之闭包与装饰器

这一篇笔记介绍 Python 里面的装饰器。想要统计add而如果我们想要统计很多个函数的执行时间,然后打印出来,应该如何操作呢?这里就可以用上 Python 里装饰器的操作。

weixin_43354181的博客 991

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Python高阶函数、闭包、装饰器

1.高阶函数 1.1高阶函数的特点 高阶具有两个特点,符合以下两个特点,则为高阶函数: 接收一个或者多个函数作为参数 函数作为返回值返回 1.2 高阶函数示例 #定义一个函数,求奇数 def s1(i): if i%2 !=0: return True #定义一个函数求偶数 def s2(i): if i%2 ==0: return True #...

不做沉默的羔羊的博客 297

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

python高级之闭包函数、lambda函数、高阶函数和装饰器

如果内函数中使用了外函数的局部变量,并且外函数把内函数返回的过程就叫闭包。例:问题1:定义函数时首先先想一个函数的名字,最好与内置函数、内置方法不重名问题2:若一个函数的功能很简单,就两行代码,我还写一个完整的函数这两个问题都可以通过匿名函数解决匿名函数:顾名思义就是没有名字的函数,这种函数只使用一次,一般函数体只有一条语句一个返回值,用于实现简单功能。例: lambda函数的特性数学中的高阶函数:y = g(f(x))Python中的高阶函数:将一个或多个函数作为函数的参数用于将一个函数应用到一个序

2403_88522504的博客 947

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python之高阶函数,闭包,装饰器

这里写目录标题一.高阶函数二.匿名函数三.filter类filter类 与 lambda函数结合使用四.闭包 一.高阶函数 高阶函数的特点(满足一下任一条特点的函数即为高阶函数): 1.接收函数作为参数. 2.将函数作为返回值返回的函数. # 高阶函数的特点(必须至少满足一个): # 1. 接受一个或多个函数作为参数 # 2. 将函数作为返回值返回 def fun(): def fun1(): pass return fun1 练习:对列表中的元素进行筛选,找出为

weixin_44831124的博客 430

【python笔记】第十节 闭包与装饰器

如果在一个内部函数里,对在外作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包闭包 = 内部函数 + 定义函数时的环境h = f() h() # 对x=10进行了延伸 h() h() h()

qinshuoyang1的博客 1430

Python之闭包、装饰器及相关习题练习

学会使用装饰器之前,首先要明白什么是闭包函数 1.闭包 (1)什么是闭包? 闭包:内部函数对外部函数作用域里变量的引用 闭包函数必须满足两个条件:1.函数内部定义的函数 2.包含对外部作用域而非全局作用域的引用 这个概念略微有一点官方,不太好理解,接下来我们用示例来说明: 示例一:以下仅仅在函数内部定义了一个函数,但并非闭包函数. 示例二:以下在函数内部定义了一个函数,而且还引用了一个外部变...

meltsnow的博客 2646

Python基础:闭包和装饰器

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

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1490

Python基础10-高阶函数、匿名函数、闭包、装饰器

学习目录七、函数(点击跳转上一章节)9. 高阶函数10. 匿名函数(lambda)11. 闭包12. 装饰器装饰器的引入装饰器装饰器的使用 七、函数(点击跳转上一章节) 9. 高阶函数 把函数作为参数 或 把函数作为返回值 的函数就是高阶函数 函数作为参数 示例1: def fn1(f): if f %2 == 0: print(f,'这是一个偶数') elif f %2 != 0: print(f,'这是一个奇数') return '' de

q19348的博客 651

python高阶函数闭包装饰器_Python学习第十一天 装饰器 高阶函数 函数嵌套 闭包...

一 什么是装饰器器即函数装饰即修饰,意指为其他函数添加新功能装饰器定义:本质就是函数,功能是为其他函数添加新功能二 装饰器需要遵循的原则1.不修改被装饰函数的源代码(开放封闭原则)2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式三 实现装饰器知识储备装饰器=高阶函数+函数嵌套+闭包四 高阶函数高阶函数定义:1.函数接收的参数是一个函数名2.函数的返回值是一个函数名3.满足上述条件任意一个,...

weixin_39903176的博客 175

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 6656

闭包与装饰器

本文介绍了Python中的闭包和装饰器概念。闭包是嵌套函数引用外部变量并返回的结构,具有三个核心特征:函数嵌套、引用外部变量和返回内嵌函数,可通过nonlocal修改外部变量。装饰器是基于闭包的高阶函数应用,在不改变原函数代码和调用方式的情况下增强功能,使用@语法糖实现。文章通过示例代码详细说明了无参数装饰器和带参数装饰器的实现方式,并阐述了装饰器的执行流程和参数传递机制。闭包为装饰器提供了底层支持,装饰器则是闭包的高级应用。

2401_83519807的博客 891

python闭包与装饰器

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

nhb687095的博客 1120
上一篇: 初学者python笔记(迭代器、生成器、三元表达式、列表解析、send()与yield())
下一篇: 初学者python笔记(装饰器后篇:登陆验证)
鸿蒙Next
鸿蒙Next 优质创作者: python技术领域 优质创作者: python技术领域
博客等级 码龄7年 2万+粉丝 300原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿蒙Next

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值