python day16:装饰器

【学习心得笔记】Python100天-第二部分Day16-Day20 本文是个人对于项目的学习的一些心得和笔记,简单记录,如有不妥之处,欢迎批评指正。 阅读详情

闭包

定义:如果在一个内部函数里,对再外部作用域的变量进行引用,那么内部函数就被认为是一个闭包

条件:1.是一个内部函数    2.函数内有外部环境的一个变量

效果:脱离环境在外部调用变量

def outer():
    x=10
    def inner():
        print(x)
    return inner
f=outer()
f()

输出结果为10

装饰器

我们设想一个场景,你已经写好了一个函数


def f():
    print('this is a function')

f()

但是你的boss让你再增加一个能输出每个函数运算所花时间的功能

你该怎么办呢?

很显然以下方法很简单

import time
def f():
    start=time.time()
    print('this is a function')
    end=time.time()
    print(end-start)
f()

但如果你要修改许多许多函数,一个一个改肯定不现实

所以我们就想到了用函数修改函数

import time
def f():

    print('this is a function')

def modify(f):
    start=time.time()
    f()
    end=time.time()
    print(end-start)
modify(f)

然而问题又来了,好端端的函数f又变成需要modify(f)才能执行,为什么不能把更改过后的函数直接赋给原来的函数呢?

import time
def f():

    print('this is a function')

def modify(f):
    start=time.time()
    f()
    end=time.time()
    print(end-start)
f=modify(f)

问题又双叒叕来了,你确定最后的f是一个函数吗?

我们之前说过了闭包的特性,在此我们可以用闭包来解决这个问题

import time
def f():

    print('this is a function')

def modify(f):
    def inner():
        start=time.time()
        f()
        end=time.time()
        print(end-start)
    return inner
f=modify(f)

这样f被修改成一个保有原来功能,并添加了能输出每个函数运算所花时间的功能的函数

这个modify函数便是一个装饰器

也可以这么表达

import time

def modify(f):
    def inner():
        start=time.time()
        f()
        end=time.time()
        print(end-start)
    return inner

@modify

def f():
    print('this is a function')

@modify就是把modify函数作为装饰器修改f函数,其意义和在最后 f=modify(f) 是一样的

可以给功能函数加参数

import time

def modify(f):
    def inner(*a):
        start=time.time()
        f()
        end=time.time()
        print(end-start)
    return inner

@modify

def f(*a):
    sum=0
    for i in a:
        sum+=i
    print(i)

也可以给装饰器加参数

import time
def one(judge):
    def modify(f):
        def inner(*a):
            start=time.time()
            f()
            end=time.time()
            if judge==True
                print(end-start)
        return inner
    return modify

@one(True)

def f(*a):
    sum=0
    for i in a:
        sum+=i
    print(i)

对于想显示运行时间,可以@one(True),不想显示可以@one(False),增加了装饰器的可用性 

day16 闭包,装饰器 闭包(closure)是函数式编程的重要的语法结构。 定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). def outer(): x=10 def inner():#条件一 inner就是内部函数 print(x)#条件二 外部环境的一个变量 return inner #结... 阅读详情

相关推荐

abaqus 根据坐标施加载荷- Analytical Field 载荷映射

在一些类型的分析中,需要将按位置分布的载荷施加到结构上,比如流体分析导出了结构的气动载荷、或者温度载荷,需要将压强分布、温度分布载荷施加到固体上。这种分析可以使用abaqus中的Analytical Field实现。 1 例子 1.1 结构 一个100*100mm的面,面的载荷分布函数为p=(x2+y2)0.5/((20.5)*100) MPa,即(0, 0)的压强为0,(100, 100)的压强为1。 1.2 载荷 载荷函数:p=(x^2+y^2)^0.5/((2^0.5)*100) in exce.

shengyutou的博客 2万+

DAY 27 函数专题2:装饰器

s:第一期day27对应5月16日知识点回顾:装饰器的思想:进一步复用函数的装饰器写法注意内部函数的返回值作业:编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值)

taoyandelajiao的博客 1360

get_seed协议

【代码】get_seed协议。

a545958498的博客 911

PYTHON_DAY_16装饰器

¶在不改变现有函数源代码以及函数调用方式的前提下,实现给函数增加额外的功能。装饰器的本质就是一个闭包函数(三步:① 有嵌套 ② 有引用 ③ 有返回)有返回代表外部函数返回内部函数的内存地址(内部函数的名称),不带'''装饰器:本质就是一个闭包 ① 有嵌套 ② 有引用 ③ 有返回'''# 开发登录验证功能print('验证登录')# 执行原有函数fn()@checkprint('发表评论')comment()

Sb3111666666的博客 38

ZYNQ学习:PL端DDR3 读写测试

DDR SDRAM 的最大特点是双沿触发,即在时钟的上升沿和下降沿都能进行数据采集和发送,同样的工作时钟, DDR SDRAM 的读写速度可以比传统的 SDRAM 快一倍。本次实验使用的 DDR3 芯片是南亚的 NT5CC256M16ER-EKI, NT5CC256M16ER-EKI 的 bank 位宽为 3,行位宽为 15,列位宽为 10,所以它的地址大小等于 2^3*2^15*2^10(即 2^28=256M),数据位宽为 16bit,所以容量大小为 256M*16bit,也就是 512MByte。

shuidiQAQ的博客 3031

【图文步骤】EC-Engineer部分操作详细步骤

EC-Engineer部分功能详细使用手册

weixin_42212468的博客 6171

Python高阶函数以及装饰器day6

如果内函数使用了外函数的局部变量,并且外函数把内函数返回的过程就叫闭包形成闭包的条件:1.函数嵌套2.将内函数作为返回值返回3.内函数必须使用外函数的局部变量。

m0_67609958的博客 1280

【制作100个unity实战之2】实现一款简单的FPS游戏

你将学到: fps武器脚本 基础瞄准功能 僵尸敌人AI 巡逻范围 攻击间 搜寻半径 追击 枪声吸引周围的僵尸 击中僵直效果

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3552

【DAY27】函数专题2:装饰器

内容来自@浙大疏锦行python打卡训练营知识点:装饰器的思想:进一步复用函数的装饰器写法注意内部函数的返回值友情提示:今天的内容难度较大,也是在我之前学习的时候卡住我很久都没理解的地方,所以任务量不多,着重理解我的示例代码即可昨天我们接触到了函数大部分的功能,然后在你日常ctrl点进某个复杂的项目,发现函数上方有一个@xxx,它就是装饰器装饰器本质上是一个 Python 函数,它可以让其他函数或方法在不需要做任何代码修改的前提下增加额外功能。

daomingwu1的博客 951

AMDGPU驱动中Doorbell与Event机制简要对比

摘要:AMDGpu驱动中,Doorbell和Event是两种异步通知机制。Doorbell是CPU→GPU的单向硬件通知,通过写MMIO寄存器触发GPU拉取任务,延迟低且无需内核介入,适用于队列任务提交。Event是GPU→CPU的双向同步通知,基于中断和内核事件对象,支持阻塞等待,用于任务完成或异常上报。核心区别在于方向、用途和实现方式:Doorbell侧重任务触发,Event侧重状态反馈。两者配合实现高效的任务下发与完成通知流程。

图形/计算GPU的驱动与虚拟化技术分享园地 1858

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

努力,加油每一天鸭~ 1037

python_day16_闭包_装饰器

昨晚事情好像是有点多,师姐让我去看恒电位仪的资料,看了将近三四个小时吧,看完第十六天的python学习视频,回宿舍的时候,就已经快十一点了,然后就没来的写博客。最近生活过的好像是波澜不,就像现在我耳机里的这首纯音乐,刚刚才意识到,这个应该是你的名字的主题曲,想想第一次看到“你的名字”这个电影名字的时候,是在大三上学期吗,反正是下matlab课后,在下楼梯的时候看到的,时间飞逝,...

161

Debezium报错处理系列之二十一:Unable to connect: Communications link failure.The driver has not received any

Debezium报错系列之二十一:Unable to connect: Communications link failure.The driver has not received any。

zhengzaifeidelushang的博客 547

DAY 29 复习日:类的装饰器-2025.9.16

Python学习29天总结:从函数到类的进阶之路 通过近一个月的系统学习,我对Python的核心概念有了更深入的理解: 函数与类的本质:函数是可复用的代码块,类是数据和行为的封装体。两者都是Python中的"一等公民",可作为参数传递或装饰器使用。 装饰器思想:深刻体会到"开放-封闭原则"的价值,通过装饰器在不修改源码的情况下扩展功能,这种非侵入式编程方式极具灵活性。 动态特性:Python强大的动态能力体现在运行时修改类结构、动态添加方法等特性上,这为元编程和框架开

m0_48133999的博客 729

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

python3层装饰器_python开发学习day16 (三层装饰器;迭代器)

2020-06-22                     目录:一、嵌套三层的装饰器二、迭代器2.1 迭代器是什么2.2 __iter__方法及其调用2.3 可迭代的对象2.4 迭代器对象2.5 for循环的原理2,6 总结迭代器一、嵌套三层的装饰器通过闭包的方式为函数体传参,可以包一层,也可以包两层@后面跟的必须是一个函数的内存地址,@函数名(参数)的形式也是可以的,前提是 “...

weixin_39950812的博客 136

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Python打卡训练营Day27

DAY 27 函数专题2:装饰器ps:第一期day27对应5月16日知识点回顾:1.装饰器的思想:进一步复用2.函数的装饰器写法3.注意内部函数的返回值作业:编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值)昨天我们接触到了函数大部分的功能,然后在你日常ctrl点进某个复杂的项目,发现函数上方有一个@xxx,它就是装饰器装饰器本质上是一个 Python 函数,它可以让其他函数或方法在不需要做任何代码修改的前提下增加额外功能。

m0_70431145的博客 1314

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

6个月Python学习计划 Day 16 - 迭代器、生成器表达式、装饰器入门

本文讲解了Python三个进阶知识点:1)生成器表达式与列表推导式的区别,生成器更节省内存;2)自定义迭代器类的实现方法,通过__iter__和__next__方法;3)装饰器的基础概念与简单实现,用于扩展函数功能。每个知识点都配有代码示例,并布置了相应练习任务,包括生成偶数、平方数迭代器和计时装饰器。这些内容是后续爬虫和Web开发的重要基础,重点是理解惰性计算、迭代协议和函数装饰的技巧。

FAN的博客 528

【Python-Day 41】揭秘函数的“魔法外衣”:一文彻底搞懂 Python 装饰器 (Decorator)

今天,我们将深入探讨一个 Python 中极其强大且富有魅力的特性——**装饰器 (Decorator)**。装饰器是 Python 函数式编程思想的杰出体现,它允许我们在不修改原函数代码的前提下,为其增加额外的功能。本文将从装饰器的基本概念、实现原理、语法糖 `@`,到 `functools.wraps` 的作用,再到带参数的装饰器和类装饰器等高级用法,为你构建一个完整而清晰的知识体系。通过本文,你将能彻底理解装饰器的工作机制,并学会在实际项目中灵活运用它来编写更优雅、更模块化的代码。

吴师兄大模型的博客 1979

Day16 -闭包和装饰器

1. 函数产生嵌套(外函数中定义一个内函数)2. 内函数使用外函数定的局部变量3. 外函数返回内函数的引用(函数名)闭包的介绍我们前面已经学过了函数,我们知道当函数调用完,函数内定义的变量都销毁了,但是我们有时候需要保存函数内的这个变量,每次在这个变量的基础上完成一些列的操作,比如: 每次在这个变量的基础上和其它数字进行求和计算,那怎么办呢?我们就可以通过咱们今天学习的闭包来解决这个需求。

m0_52426915的博客 134

python_day16_装饰器

装饰器基础写法。

Yel10w_的博客 192

python学习 new_day16 嵌套三函数的装饰器

python学习 new_day16嵌套三函数的装饰器 嵌套三函数的装饰器 当正常的嵌套两函数的装饰器不够满足需求,需要更多功能,也就是第三个函数时,嵌套三函数的装饰器应运而生 按以前思路的写法: def outter(*args1,**kwargs1): def auth(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) print(args1,kwargs1) # 运用上外函数新添加的参数 return

wuzeipero的博客 159

python三层装饰器-python开发学习day16 (三层装饰器;迭代器)

2020-06-22                      目录:一、嵌套三层的装饰器二、迭代器2.1 迭代器是什么2.2 __iter__方法及其调用2.3 可迭代的对象2.4 迭代器对象2.5 for循环的原理2,6 总结迭代器一、嵌套三层的装饰器通过闭包的方式为函数体传参,可以包一层,也可以包两层@后面跟的必须是一个函数的内存地址,@函数名(参数)的形式也是可以的,前提是 “...

weixin_37988176的博客 213

Day 11:函数装饰器

在说装饰器前,先说一个东西,再Python里,有一个 一切皆对象,一切皆变量。 例: 1 def hello(name="sunjinyao"): 2 return "hi " + name 3 print(hello()) 4 # 输出: 'hi sunjinyao' 5 # 我们可以将一个函数赋值给一个变量,比如 6 hi = hello 7...

ajj0225的博客 166

从0开始学python(day16——函数的高级应用)

装饰器是Python中的特色语法,可以通过装饰器来增强现有的函数,这是一种非常有用的编程技巧。一些复杂的问题用函数递归调用的方式写起来真的很简单,但是函数的递归调用一定要注意收敛条件和递归公式,找到递归公式才有机会使用递归调用,而收敛条件确定了递归什么时候停下来。函数调用通过内存中的栈空间来保存现场和恢复现场,栈空间通常都很小,所以递归如果不能迅速收敛,很可能会引发栈溢出错误,从而导致程序的崩溃。

qq_56657939的博客 998

Day16-Python基础学习之闭包和装饰器

闭包​fn1 = outer("Hello") # 类型是函数 注意这里传入的参数对于内部函数来说是持续存在的​# 修改外部函数的值return In​fn(10)fn(10)​# 案例else:return atm​atm(100)​# 总结:闭包优点是无需定义全局变量即可实现通过函数持续访问、修改某个值,闭包使用的变量难以被错误的调用修改。

m0_46053885的博客 447

Day5 python基础5 装饰器

一、python装饰器基本概念   定义:本质是函数,用来装饰其他函数,即为其他函数添加附加功能。   原则:1.不能修改被装饰函数的源代码;      2.不能修改被装饰函数的调用方式。   实现装饰器的知识储备:     1.函数即“变量”。     2.高阶函数       a.把一个函数名当作实参传给另一个函数;       b.返回值中包含函数名。  ...

baiduipuyan1331的博客 115
上一篇: python day14 深浅拷贝,集合,函数
下一篇: python day17:迭代器,生成器,time和random模块
Dovah1n
博客等级 码龄6年 404粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值