pyhotn3入门基础-15 装饰器与偏函数

Python入门基础教程(非常详细) Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」。Python类库(模块)极其丰富,这使得Python几乎无所不能,不管是传统的Web开发、PC软件开发、Linux运维,还是当下火热的机器学习、大数据分析、网络爬虫,Python都能胜任。这套Python基础教程不是教科书,不会玩弄概念,而是力求口语化和通俗化,让读者尽快入门。如果有小朋友出于兴趣学习Python,请引导他阅读本教程的前半部分,这是基础,可以降低学习成本;... 阅读详情

函数对象有一个__name__属性,可以拿到函数的名字:

>>> def now():
	print('2017-6-15')

	
>>> f = now
>>> f()
2017-6-15
>>> f.__name__
'now'
>>> now.__name__
'now'

假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)

decorator就是一个返回函数的高阶函数

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

要借助Python的@语法,把decorator置于函数的定义处:

>>> @log
def now():
	print('2017-06-15')

调用now()函数,不仅会运行now()函数本身,还会在运行now()函数前打印一行日志:

>>> now()
call now():
2017-06-15

把@log放到now()函数的定义处,相当于执行了语句:

now = log(now)

由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。

wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂。比如,要自定义log的文本

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator
@log('execute')
def now():
    print('2015-3-25')
结果:

>>> now()
execute now():
2015-3-25
效果等同于

>>> now = log('execute')(now)

>>> now.__name__
'wrapper'

因为返回的那个wrapper()函数名字就是'wrapper',所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。

不需要编写wrapper.__name__ = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的,所以,一个完整的decorator的写法如下:

import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

import functools

def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator


偏函数

简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。





Python函数专题:偏函数 偏函数是指通过固定一个或多个参数,来创建一个新的函数。这个新的函数可以接收未被固定的参数。偏函数的构建可以帮助简化函数的调用,尤其在需要多次调用同一个函数但参数部分相同时。偏函数在Python中提供了一种强大的工具,帮助我们简化函数调用及参数管理。它不仅提高了代码的可读性和可维护性,还有助于减少重复代码。在实际应用中,偏函数可以广泛用于回调函数、配置参数、数据处理等场景。当然,我们在使用偏函数时也要注意适度,避免因过度嵌套而导致代码可读性下降。通过合理使用偏函数,我们可以更好地组织代码,并提升开发效率。 阅读详情

相关推荐

pyhotn的p2p-sip网络电话小试牛刀

p2p-sip是一个P2P的电话协议,有人写了python实现。 这个只支持python2,2.6以上 pip安装,或者下载安装包解压。 解压后有readme,啃一下英文。 编写webcaller.py import gevent, sys from gevent import monkey; monkey.patch_all() from gevent.pywsgi import WS

有意没思的专栏 6572

如何在pyhotn的中取出最大值

例如 : 将列表[13, 20, 42, 85, 9, 45]中的最大值为85 提示:使用多种方法 方法一: num_01 = [13,20,42,85,9,45] print(max(num_01)) 方法二: num_02 = [13,20,42,85,9,45] num_02.sort() print(num_02[-1]) 方法三: num_03 = [13,20,42,85,9,45] ...

qq_42792477的博客 328

【CarMaker实战指南】从零构建环形测试场景与车辆连续仿真

本文详细介绍了如何使用CarMaker软件从零构建环形测试场景与实现车辆连续仿真。通过分步指导搭建闭环道路、连接交叉路口、规划车辆轨迹等核心操作,帮助用户掌握CarMaker的基础应用技巧,并提供了常见问题排查与进阶优化建议,适用于车辆耐久性测试和自动驾驶算法验证等场景。

weixin_29274969的博客 235

pyhotn3入门基础-1

1. 输入输出: 输出 print('hello world') hello world print('a','d') //遇到逗号会输出空格,输出 a d >>> print(300) 300 >>> print(100 + 200) 300>>> print('100 + 200 =', 100 + 200) 100 + 200 = 300 输入 name = input()

趁着年轻,多学学 515

星网宇达Newton-M2设备安装及配置

主要介绍了星网宇达Newton-M2设备的配置过程

weixin_49353445的博客 2676

CentOS 7下Ollama+Dify+DeepSeek离线部署全攻略(附模型迁移技巧)

本文详细介绍了在CentOS 7无网环境下,从零开始离线部署Ollama、DeepSeek模型与Dify平台的完整实战攻略。内容涵盖基础环境规划、Ollama服务安装、模型文件迁移技巧、Docker引擎离线部署,以及Dify平台与本地Ollama服务的集成配置,为企业内网构建安全、可控的AI应用提供了一套经过验证的解决方案。

weixin_28826521的博客 350

pyhotn笔记7-异常处理

【代码】pyhotn笔记7-异常处理。

tuchaobo的博客 442

PCL1.12.1+VTK9.1+Qt5.14.2实战:解决QVTKOpenGLNativeWidget点云渲染窗口初始化报错问题

本文针对PCL1.12.1、VTK9.1与Qt5.14.2集成开发中,QVTKOpenGLNativeWidget点云渲染窗口初始化时出现的报错与黑屏问题,提供了深度分析与两种实战解决方案。核心在于理解VTK版本升级导致的渲染窗口类型不匹配,并指导开发者通过显式创建vtkGenericOpenGLRenderWindow或利用窗口ID嵌入,正确初始化并绑定可视化组件,从而稳定实现点云渲染。

weixin_29284657的博客 222

Pycharm及python安装详细教程

首先我们来安装python 1、首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图中红色圈中区域进行下载。 2、下载完成后如下图所示 3、双击exe文件进行安装,如下图,并按照圈中区域进行设置,切记要勾选打钩的框,然后再点击Customize install

陌上行走的博客 76万+

【原理图PCB专题】Cadence 17.4版本原理图及PCB 模块复用

在我们设计复杂板卡的时候,往往会遇到一部分电路被反复使用的情况。Cadence允许设计者一开始就将复用模块设计好,以后只要直接调用复用模块就可以直接用以设计更复杂的电路板了。这对于大规模集成设计无疑是非常好的选择,它不仅让设计者不必花费时间在相同模块反复设计上,更有利于电路的模块化设计。

一点硬件 2017

2xmax96717+max96724+agx orin驱动代码

说明:这里主要解决max96717的设备地址和sensor地址映射,vc0->vc1多颗max96717+max96724使用配置思路如下: 1、改变max96717的pipez stream id,然后max96724的pipe绑定使用相应的stream id 2、max96717默认是vc0,把vc0改写成vc1\vc2\vc3,然后max96724再重新映射vc输出

mantouyouyou的博客 113

10年程序员职业生涯感悟—写给正在迷茫的你

希望能带给大家不一样的参考。或者能提前预防,少走弯路!

pythonandaiot的博客 1万+

YOLOv11改进 | Conv/卷积篇 | 轻量化多尺度异构卷积(MSHC)优化YOLOv11精度(全网独家首发)

本文介绍了Hype-YOLO提出的MANet结构,这是C3、C2f、C3k2的升级版,能显著增强特征提取能力。MANet整合了DSConv和C2f结构,通过多分支异构设计提升梯度流动和特征语义深度。文章详细解析了MSHC模块的原理,包括其多尺度并行建模、通道混洗等核心机制,并提供了完整的代码实现和训练教程。实验表明,Hype-YOLO的精度优于YOLOv11。该结构在保持轻量化的同时,通过异构分支设计实现了更丰富的特征表达,适用于目标检测等视觉任务。

Snu77的博客 952

Python-偏函数

在Python中,偏函数(Partial Function)是一个用于固定某些参数值的新函数,返回一个新的函数对象,这个新的函数对象会忽略掉一些指定的位置参数(positional arguments)或关键字参数(keyword arguments)的默认值。偏函数的主要用途是当我们需要多次调用一个函数,并且每次调用都使用相同的某些参数值时,我们可以使用偏函数来简化这个调用过程。Python的functools模块提供了一个partial函数来创建偏函数。

sgdhshshhs的博客 1191

Python爬虫实战:基于Scrapy和Playwright的深交所数据采集

本文将详细介绍如何使用Python最新技术栈(Scrapy框架结合Playwright浏览器自动化)爬取深圳证券交易所(www.szse.cn)的公开数据。文章包含完整项目搭建、反爬策略应对、数据解析存储等全流程实现,并附详细代码示例和性能优化建议。python复制下载# 上市公司基本信息# 财务数据revenue = scrapy.Field() # 营业收入net_profit = scrapy.Field() # 净利润eps = scrapy.Field() # 每股收益。

2201_76125261的博客 951

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python装饰器

  python中装饰器的作用就是给一个函数添加一些额外的功能,但是又不改变函数本身,这样就很方便了,因为你可以给很多函数都添加一些同样的功能,而只需要写一个装饰器就搞定了。 先定义一个简单的函数: def func(): print('今天是2018-11-23.') 想在这个函数执行前加一句话:call func(): 由于python中函数也可以作为参数传入另一个函数,所...

luotuofeile的博客 205

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Pyhotn入门——类的构造和使用

大家好,这两天比较闲,在自学python,刚看完了类这一章,总结一下。一. __init__python的类和C++的类大体上还是比较类似的,但python的类中多了__init__这一设定。__init__方法是用来初始化类的,例如:Class A: def __init__(self,a = 1,b = 2): self.a = a self.b = b...

Miss_yuki的博客 1万+

STM32F407中文手册

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python取数字前n位

python取数字前n位 思路::如果我们要取一个位数很多的数字前n位(int型),可以将其转换为字符串类型后操作。 #创建一个较大的数(阶乘) def jie(n): s=1 for i in range(1,n+1): s=s*i return s s=jie(100) str=repr(s) #int型转换为string...

weixin_43858012的博客 2万+

Oracle 单行函数

学习Oracle 单行函数: 包括字符函数,数值函数,日期函数,转换函数,通用函数。 dual是一个”伪表”,可以用来测试函数和表达式。 1, 字符函数 包括大小写控制函数,字符控制函数。 大小写控制函数:lower,upper,initcap。 字符控制函数:concat,substr,length,instr,lpad | rpad,trim,replace。 select lower( la...

Brave的博客 309

Python:提取表格中一列的前几位数

a=[x[:2] for x in train a 问题: 要取第一列 Item_identifier的前两位字母, 比如0行中的‘FDA15’,需要提取‘FD’两个字符,并创建新的一列Iden2在表格中。 train['Iden2']=[x[:2] for x in train['Item_Identifier']] **Output:**最后一列Iden2只有头两位字符。 ...

WHYbeHERE的博客 1万+

python开发平台介绍_【Python 入门】简介与搭建开发环境

一、Pyhotn 简介Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 是一种代表简单主义思想的语言。阅读一个良好的 Python 程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python 的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。...

weixin_35501172的博客 2589

pyhotn3入门基础-7函数

内置函数调用 查看内置函数 help(abs)  1.  abs() 绝对值 >>> abs(100) 100 >>> abs(-20) 20 >>> abs(12.34) 12.34 2.  max() 最大值 >>> max(1, 2) 2 >>> max(2, 3, 1, -5) 33.  数据类型转换 >>> int('123') 123 >>> int(12.34) 12 >

趁着年轻,多学学 532

pyhotn3入门基础-3 字符串

声明编码方式 #!/usr/bin/env python3 这句可以在linux或者mac 中可以直接运行.py文件的声明 # -*- coding: utf-8 -*-必须使用UTF-8 无BOM 的编码格式 格式化

趁着年轻,多学学 367

pyhotn 常用地址

pysco 说明文档python curl啄木鸟 Pythonic 

覆杯水在堂前 596

Python 装饰器

装饰器 decorator:可动态为函数添加新的功能 使用方法:

Soleil的博客 348

python语法-偏函数和装饰器

装饰器促发后的执行过程:当某个函数加上@装饰器以后,这个装饰器马上被执行,上面例子中,就是logging()函数被执行。而logging函数的返回值,才开始执行被装饰得函数say()。第一步:执行装饰器@delay,这个装饰器函数是一个偏函数,是一个新的类了,不再是原始的类DelayMan。这里记录下自己理解的装饰器:装饰器就是装饰现有函数,现有函数不需要有任何代码修改的情况下,增加函数的功能。2、偏函数提前固定了2个参数,包装啦一层函数,简化了函数的调用,产生来新的函数地址。第三步:执行add()函数。

CV_YOU的博客 373
上一篇: pyhotn3入门基础-14 返回函数和匿名函数
下一篇: android 添加curl支持
大大大v
博客等级 码龄12年 10粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值