修改其他函数的功能的神器——python装饰器

一文掌握python三大神器(迭代器、生成器、装饰器)(一) 一文掌握python三大神器(迭代器、生成器、装饰器) 阅读详情

目录

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:961562169

1.函数装饰器介绍

装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。

所谓“语法糖”指的是编程语言中对功能没有影响但是能显著提高易用性和可读性的特殊语法,本文要谈到的“装饰器”是python最重要的语法糖,没有之一。

当需要对已有的函数添加额外的功能时:

  • 个人程序-直接修改代码
  • 函数封装-创建新封装函数
  • 装饰器处理

2.个人程序

#对已有的函数添加额外的功能
#比如为整个程序添加个计时功能
import random
import time
#从1-10**8中随机挑选n个数,并从小到大排序
def getList(n):
    # 开始前计时
    start_time=time.time()
    seq=list(range(1,pow(10,6)))
    x=random.sample(seq,n)
    y=sorted(x)
    # 结束后计时
    end_time=time.time()
    print("Time userd:%s"%(end_time-start_time))
    return y
result=getList(1000)
print(len(result),type(result))

如果是个人程序,这样的解决方案无可厚非,
但如果是集体开发的大型项目,这样的改动通常是不被允许的,
如果大家都为了各自的需求在原函数中添加代码,很可能会造成灾难性的后果。
还有一种解决方案,就是将原函数封装到一个新的函数中,
在新函数中对原函数的运行时间进行计算。

3.函数封装

import random
import time
#从1-10**8中随机挑选n个数,并从小到大排序
def getList(n):
    seq=list(range(pow(10,6)))
    x=random.sample(seq,n)
    y=sorted(x)
    return y
def getListTime(n):
    # 开始前计时
    start_time=time.time()
    r=getList(n)
    # 结束时计时
    end_time=time.time()
    print("Time userd:%s"%(end_time-start_time))
    return r
result=getListTime(10000)
print(len(result),type(result))

上面代码中使用getListTime( )函数对getList( )函数进行了封装,
在getList( )函数执行前和结束后分别计时,然后求得函数耗时。
这种方案不用修改原函数中的代码,
看似可行,实际上存在很多的问题。使用该方案

  • 不仅需要为每一个需要功能拓展的函数分别新建一个新函数,
  • 而且还要修改所有的调用,
  • 如果需要功能拓展的函数有成百上千个,可想而知会带来多大的工作量。

如何简洁优雅地实现函数的功能拓展呢?python中最佳方案是“装饰器”。

4.“装饰器”处理

import random
import time
#从1-10**8中随机挑选n个数,并从小到大排序
def getList(n):
    seq=list(range(pow(10,6)))
    x=random.sample(seq,n)
    y=sorted(x)
    return y
def getTuple(n):
    seq=list(range(pow(10,6)))
    x=random.sample(seq,n)
    y=tuple(sorted(x))
    return y
def getListTime(func):
    def wrapper(n):
        # 开始前计时
        start_time=time.time()
        r=func(n)
        # 结束时计时
        end_time=time.time()
        print("Time userd:%s"%(end_time-start_time))
        return r
    return wrapper
# result=getListTime(getList)(100)
result=getListTime(getTuple)(100)
print(len(result),type(result))

# 装饰器函数,使用函数作为参数
def decorator(func):
    def wrapper(n):
        start_time=time.time()
        r=func(n)
        end_time=time.time()
        print("Time userd:%s"%(end_time-start_time))
        return r
    return wrapper

@decorator
def getList(n):
    seq=list(range(pow(10,6)))
    x=random.sample(seq,n)
    y=sorted(x)
    return y
result=getList(100)
# result=getListTime(getTuple)(100)
print(len(result),type(result))

# 给多个函数添加装饰器
@decorator
def getTuple(n):
    seq=tuple(range(pow(10,6)))
    x=random.sample(seq,n)
    return tuple(x)
result=getTuple(100)
print(len(result),type(result))


# 给多参数函数添加装饰器
def decorator(func):# 1,2,3 ,host=‘localhost’ password='123456'
    def wrapper(*args,**kwargs):
        start_time=time.time()
        r=func(*args,**kwargs)
        end_time=time.time()
        print("Time userd:%s"%(end_time-start_time))
        return r
    return wrapper
@decorator
def add_two_number(a,b):
    return a+b
@decorator
def getTuple(n):
    seq=tuple(range(pow(10,8)))
    x=random.sample(seq,n)
    return tuple(x)
add_two_number(1,2)
r=getTuple(100)

# 使用多个装饰器装饰一个函数
def decorator1(func):
    def wrapper(*args,**kwargs):
        print("first dec start!")
        r=func(*args,**kwargs)
        print("first dec end!")
        return r
    return wrapper
def decorator2(func):
    def wrapper(*args,**kwargs):
        print("second dec start!")
        r=func(*args,**kwargs)
        print("second dec end!")
        return r
    return wrapper

@decorator1
@decorator2
def add_two_number(a,b):
    return a+b
add_two_number(100,200)
wannier_tools:Wannier工具-Source material Wannier工具 作者和贡献者 WannierTools于2012年由IOP CAS Beijing的Wu QuanSheng Wu(EPFL CH)和Zhang Shengnan Zhang(EPFL CH)初始化。 岳长明(UniFR CH):旺尼(Wannier)紧束缚哈密顿量的对称化。 Yifei Guan(EPFL CH):Landau等级计算。 张田田(东京工业大学):声子系统中的LOTO校正。 刘毅(北京师范大学):Ruge-Kutta集成。 拉下包装 git clone 简要介绍 我们提供了一个开源软件包WannierTools,这是一种用于研究新型拓扑材料的软件。 该代码在紧密绑定框架中工作,该框架可以由另一个软件包Wannier90生成。 它可以通过计算Wilson环来帮助对给定材料的拓扑相进行分类,并可以获得通过角分辨光发射(ARPES)和扫描隧道显微镜( 立即下载

相关推荐

基于微信小程序的智能门禁管理系统的设计与实现(文章+源码)

基于微信小程序门禁管理小程序,该系统支持用户注册登录、查阅新闻动态、提交开门申请和发布留言等功能,同时管理员可以进行用户管理、新闻信息管理、门禁审批管理和留言管理等操作。该系统将采用IDEA开发工具、SSM框架和MYSQL数据库等相关技术,实现用户登录注册、个人信息管理、门禁申请提交、管理员审核等功能。该系统的实现,可以有效提高门禁管理的效率和便利性,同时也具有较强的可扩展性和可维护性。本研究对于智能门禁管理系统的设计和实现具有一定的参考价值。

u011779145的博客 1399

wannier插值能带拟合5

Wannier90是一个构建局域轨道基组的有力工具,一般用来计算紧束缚模型中的占位能和跳跃积分,再结合杂化泛函或GW方法,插值得到更为准确的能带结构,或者计算极化、输运、拓扑不变量等物理性质。在其输入文件中,num_wann、num_bands、projections和energy window是几类极其重要的参数,如果设置不当,容易导致Wannier函数不够局域,计算结果误差很大。对于比较复杂的体系,这些参数的默认值一般不符合要求,需要手动指 定。在这里总结一下个人关于如何设定这些参数的经验,欢迎大家批

bubu789的博客 3505

深度学习二分类实战:用Python+Keras搞定基因表达数据预测(附完整代码)

本文详细介绍了如何使用Python和Keras构建深度学习模型进行基因表达数据的二分类预测。通过数据预处理、特征选择、神经网络构建及优化策略,特别针对小样本场景提供了调参技巧和模型解释方法。文章还包含完整的代码示例,帮助读者快速掌握深度学习在生物信息学中的应用。

weixin_30642561的博客 245

wannier拟合能带总是拟合不上_Wannier 90使用教程

Wannier90 使用教程第一步,计算能带 (正常DFT计算)。因为之后要跟拟合的能带对比。第二步,首先做一次自洽,加上NBANDS(正常DFT自洽), 通过使用wannier90拟合能带。第二步的详细过程:(注意: 以下2 ,3步是合并在一步的。)1.DFT自洽(并在INCAR中添加NBANDS,可以不加,之后运行与wannier90接口的vasp需要加上NBANDS,且需要与此步的NBAN...

weixin_39866974的博客 4372

hi3516cv610在PQStream上实现拉出图像,windows和板端操作记录

PQStream拉出图像

weixin_51838255的博客 728

VTK vtkLookupTable vtkScalarBarActor 颜色条

有时需要给数据做一个 vtkScalarBarActor, 我们把显示的数据的一个 坐标系 来显示 颜色条1.以 Z 显示颜色 效果如下。

q610098308的专栏 4036

wannier插值能带拟合3

今天老王来介绍一下VASP与wannier90结合构建基于第一性原理的紧束缚模型。 首先登录wannier90官网下载wannier90 2.1版本 Download - Wannier90​www.wannier.org 为什么是2.1版本呢? 因为2.1版本是可以与VASP结合的最新版本。但是2.1版本默认安装与VASP接口并不好,主要是借助肖承诚博士写了一个Fortran的接口(https://github.com/Chengcheng-Xiao/VASP2WAN90_v2_fix)(这里感谢

bubu789的博客 8388

声发射传感器的工作原理是什么?

介绍声发射传感器的工作原理。

qq_39948394的博客 9246

wannier拟合能带总是拟合不上_科学网-Wannier90输入文件中num_wann, num_bands, 和energy window等参数设置规则-李云海的博文...

基本规则Wannier90是一个构建局域轨道基组的有力工具,一般用来计算紧束缚模型中的占位能和跳跃积分,再结合杂化泛函或GW方法,插值得到更为准确的能带结构,或者计算极化、输运、拓扑不变量等物理性质。在其输入文件中,num_wann、num_bands、projections和energy window是几类极其重要的参数,如果设置不当,容易导致Wannier函数不够局域,计算结果误差很大。对于比...

weixin_29529047的博客 2882

让 PyCharm 代码“发光”:高亮插件与特效全攻略

PyCharm 作为一款强大的 Python IDE,支持多种插件让代码“发光”——无论是动态输入特效、彩虹括号,还是霓虹主题,都能让你的代码脱颖而出!进入 File → Settings → Editor → Color Scheme → Rainbow Brackets。进入 File → Settings → Appearance & Behavior → Material Theme。进入 File → Settings → Editor → Color Scheme → General。

qq_43580271的博客 3835

如何通过单步调试的方法,找到 SAP Gateway 到底把 Fiori 应用发送的 OData 请求,投递到哪一台 ABAP 后台服务器了?

这是一个 Count 请求,得到服务器响应的数据是 204,这个 204 会以数字的形式,显示在 Fiori Launchpad tile 上。那如果当前 Gateway 系统可以连接到多台 ABAP 后台服务器,比如下图所示,可以连接 SAP S/4HANA,ERP 或者 SAP CRM,我怎么知道 SAP UI5 应用上显示的数据,到底来自哪一台 ABAP 后台服务器呢?,就是上图 ABAP 调试器里断点停留的位置,即 SAP Frontend 服务器,通过 RFC 将 OData 请求投递给。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 642

Bloch定理 and Wannier Function

<br />布洛赫定理<br />对于周期性势场,单电子薛定谔方程的本征函数是按布喇维格子周期性调幅的平面波。遵从周期势单电子薛定谔方程的电子,或用布洛赫函数描述的电子称为布洛赫电子。波矢k的取值由边界条件定。取周期性边界条件,但不仅限制边长为L的立方体。我们强调周期性边界条件是对有限大的晶体。为得到晶体性质所采取的数学处理上最简便的边界条件。<br /><br />这里要附加说明的是,周期性边界条件去掉了表面对平移对称性的破坏,使有限大的晶体具有了完全的平移对称性。利用正格子、倒格子基矢间的正交关系,许可

zggzdulanduo的专栏 6380

Python全栈入门到实战【进阶篇 1】类与对象:面向对象编程的基石

Python中定义类使用**class关键字**,创建对象使用**类名()**(类似调用函数),语法简洁,我们从最基础的空类开始,逐步拆解。class# 定义空的学生类,pass表示占位,无实际内容 class Student : pass编码规范:类名遵循大驼峰命名法(每个单词首字母大写,无下划线),如StudentCarPhone,这是Python官方推荐的PEP8规范,便于区分类和其他标识符。实例方法必须定义在类内部;实例方法的第一个参数必须是self(名称可自定义,如this。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 3404

[python] 三大神器—生成器、迭代器、装饰器

文章目录1. 生成器1.1 生成器表达式 (...)1.2 生成器函数 yield2. 迭代器2.1 可迭代对象1.可用 `isinstance()` 判断2.可以被 `next()` 函数调用2.2 迭代器1.可用 `isinstance()` 判断2.可以通过 `iter(Iterable)` 创建迭代器3.`for item in Iterable`4.range()不是迭代器3. 装饰器3...

Alin_Zhang 801

精雕软件(JDpaint) 5.5 绿色版

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

请详细介绍python三大神器:迭代器、生成器、装饰器

与普通的函数不同,生成器函数使用yield关键字来产生一个序列的值,而不是通过return返回一个值。生成器可以高效地生成大量数据,而不需要占用大量的内存。迭代器(Iterators): 迭代器是一个对象,它允许逐个访问容器中的元素,而不需要提前把容器中的元素加载到内存中。装饰器函数将被修饰的函数作为参数,并返回一个新的函数,该函数通常包装了原函数的功能或添加了额外的功能。以上是对Python三大神器的详细介绍,它们在Python编程中起着重要的作用,可以提高代码的复用性、可读性和性能。

2301_79698214的博客 291

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

21-Python 装饰器

简明python 装饰器介绍简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的...

bigzql的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

一文看懂Python系列之装饰器(decorator)(工作面试必读)

Python的装饰器(decorator)可以说是Python的一个神器,它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能。Python的装饰器同时也是Python学习从入门到精通过程中必需要熟练掌握的知识。小编我当初学习Python时差点被装饰器搞晕掉,今天尝试用浅显的语言解释下Python装饰器的工作原理及如何编写自己的装饰器吧。   Python装饰器的本质   P...

大江狗 2万+

Python入门:Python3 装饰器全面学习教程

Python入门:Python3 装饰器全面学习教程,本文全面介绍Python装饰器,从核心概念到实战应用。装饰器是接收函数或类并返回新函数或修改后类的函数,可动态扩展功能,语法为@decorator_name。文中讲解函数装饰器基础、带参数及自身带参数的情况,还介绍类装饰器的两种形式及应用。同时说明了@staticmethod等内置装饰器,以及多个装饰器的堆叠使用,最后总结了装饰器在日志记录等场景的应用,帮助读者掌握这一灵活特性。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 14万+

python装饰器作用和功能_装饰器作用与原理

装饰器作用与原理装饰器是python的一个神器,它赋予函数改变自身行为的能力,下面通过一个例子,来理解装饰器的作用以及原理1. 装饰器的作用当你编写了一段程序,发现程序运行的很慢,调试过程中,你需要知道程序执行过程中每一个函数的执行时间,以此来确定哪里需要优化性能,通常的做法是在函数开始的时候记录一次时间,在函数结束的时候记录一次时间,这两个时间的差值就是函数的执行时间。这样做的确可以实现目标,但...

weixin_39938165的博客 3672

闭包与装饰器:Python 函数式编程的 “黑魔法”

本文深入讲解了Python中的闭包和装饰器两大核心概念。闭包是嵌套函数的特殊形式,允许内部函数"记住"外部变量状态,常用于计数器等场景。装饰器基于闭包实现,通过语法糖@在不修改原函数代码的情况下为其添加功能(如日志、计时等)。文章详细演示了装饰器的基本用法、带参数装饰器的实现、元信息修复等技巧,并列举了日志记录、权限验证、结果缓存等实际应用案例。掌握这两个概念能让代码更简洁、灵活且易于扩展,是编写Pythonic代码的重要技能。

2402_85519509的博客 1644

python中的三大神器之装饰器

一.前言 python中的三大神器:装饰器,迭代器与生成器!感觉就和面对对象思想的三大特性一样:继承,多态和封装,点开链接即可查看。好了废话就不说了,下面直接讨论装饰器吧 略微回顾一下: 生成器中有yield,仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得。迭代器,具有访问生成器的能力,可以访问到生成器的值,类似于生成器的__next__方法,一个一个值一个值得去迭代...

weizhifei1234的博客 315

Python三大神器之装饰器

  在之前的文章中写了Python的生成器和迭代器,今天给大家分享一下关于装饰器的一些知识。 闭包 在讲装饰器之前一定要提及的就是闭包,因为Python中的闭包是实现装饰器的基础。 # 定义一个函数 def test(number): # 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包 def test_in(nu...

年华终归属时光的博客 1176

Python装饰器的认识

Python装饰器的认识 python语言,一切皆对象,万物皆可引用。 装饰器(Decorator)python的三大神器之一。(另外两大类分别是迭代器和生成器) 简单的说:装饰器是修改其他函数的功能,有助于代码更短。 后续待深入了解后,装饰器将会经常在源码中看到,那时自可体会到封装、继承、多态的价值。 此次的温故,自己将从以下几点阐述: 1、闭包 概念: 在函数嵌套的前提下, 内部函数使用了外...

weixin_45453649的博客 418

Python装饰器:给函数穿件“智能外衣“,功能秒升级!

你有没有过这样的经历?写了一个核心功能函数,突然需要给它加日志记录、性能监控或者权限校验——直接改函数代码吧,怕影响原有逻辑;复制粘贴功能吧,又违背代码复用原则。这时候,Python的装饰器(Decorator)就像一件"智能外衣",能在不修改原函数的前提下,轻松给函数"穿"上各种扩展功能。今天我们就来揭开这位"代码美容师"的神秘面纱。

yue_yun_的博客 918

python三大神器装饰器_搞定三大神器之 Python 装饰器

搞定三大神器之 Python 装饰器

weixin_39966053的博客 90
上一篇: python中的yield和return—迭代器和生成器
下一篇: Python爬虫教程,slenium模拟登陆知乎2020
Python_sn
博客等级 码龄6年 324粉丝 290原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值