python 匿名函数装饰器
匿名函数
关键字lambda表示匿名函数,冒号前面的x表示函数参数
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25
也可以把匿名函数作为返回值返回,比如:
def build(x, y):
return lambda: x * x + y * y
装饰器
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
>>> def now():
... print('2015-3-25')
...
>>> f = now
函数对象有一个__name__属性,可以拿到函数的名字:
>>> now.__name__
'now'
>>> f.__name__
'now'
一个decorator,接受一个函数作为参数,并返回一个函数
把原始函数的__name__等属性复制到wrapper()函数中
不需要编写wrapper.__name__ = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def now():
print('2015-3-25')
把@log放到now()函数的定义处,相当于执行了语句:
now = log(now)
log()是一个decorator,返回一个函数,
原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数
调用now()将执行新函数,即在log()函数中返回的wrapper()函数。
wrapper()函数的参数定义是(*args, **kw),
wrapper()函数可以接受任意参数的调用。
在wrapper()函数内,首先打印日志,再紧接着调用原始函数。
针对带参数的decorator:
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
3层嵌套的decorator用法:
@log('execute')
def now():
print('2015-3-25')
执行结果:
>>> now()
execute now():
2015-3-25
3层嵌套的效果:
>>> now = log('execute')(now)
首先执行log('execute'),返回的是decorator函数,
再调用返回的函数,参数是now函数,返回值最终是wrapper函数。
转载于:https://www.cnblogs.com/wander-clouds/p/8454946.html
python 匿名函数装饰器相关推荐
- python中tracer函数意思_浅析Python编写函数装饰器
本节主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. 这是一个通过类装饰的语法写成的装饰器,测试如下: 运 ...
- Python笔记-函数装饰器
在调用某个方法前,想调用一些额外的东西. 个人感觉就和C++里面,带一个函数指针的的参数,在某个函数执行前,调用这个函数指针,或者,在某个函数中,直接调用这个函数.比如插入日志等.功能. 但在pyth ...
- python 闭包_一起看流畅的python:函数装饰器和闭包
装饰器 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数).装 饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个 函数或可调用对象. 装饰器的一个关键特性是,它们在被装饰的函数定义 ...
- Python笔记-函数装饰器的缺点
装饰器的好处,复用了代码,缺点就是原函数的元信息不见了 比如函数docstring._name_.参数列表 如下代码: def use_logging(level = "debug" ...
- python装饰器函数-Python函数装饰器指南
Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...
- python函数修饰器_Python函数装饰器指南
Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...
- python函数装饰器详解_Python语言函数装饰器用法实例详解
这篇文章主要介绍了Python语言函数装饰器用法,以实例形式较为详细的分析了Python函数装饰器的常见使用技巧,需要的朋友可以参考下,希望对大家学习Python语言有所帮助. 本文实例讲述了pyth ...
- python三大神器装饰器_Python2.x
1)自动化 2)python编写的 openstack jumpserver ansible SaltStack yuanj zabbix json docker yaml 2)The Zen of ...
- Python中的装饰器、迭代器、生成器、推导式、匿名函数和高阶函数
文章目录 装饰器 迭代器 生成器 推导式 匿名函数 高阶函数 装饰器 闭包 介绍装饰器前先了解一下闭包,在Python中,一切皆对象(Object),函数(Function)也不例外,也是一个普通的对 ...
最新文章
- 测试结果分析_9种国内外纺织品耐摩擦色牢度测试方法结果分析
- html5 form表单,html5 教程
- 简单快速开发C\S架构程序用最简单的不分层最快的效率达到功能要求的例子程序FrmKnowledge日积月累功能的实现...
- Linq to SQL只支持SQL Server(所选对象使用不支持的数据提供程序)
- [html] 写一个类似刮刮卡效果的交互,即鼠标划过时显示号码
- C++链表插入节点函数为什么要传递头节点的二维指针
- 披荆斩棘:饿了么业务架构的演进之路
- 咪蒙,毕业两年成阿里P7,不止阿里HR不同意......
- Caffe学习:使用pycaffe生成mean_file.py文件
- 软件开发学什么编程语言好
- 科学计算机计算等比求和公式,等比数列求和公式
- 再见所有的翻译工具!我使用了有道智云+Python开发一个批量文档翻译工具,老大对我赞不绝口
- 配置打印机共享时 报错 无法访问您可能没有权限使用网络资源
- kpi绩效考核流程图_XX公司KPI绩效考核案例.doc
- MATLAB---绘制三维图形函数实例介绍
- 计算机网络共享服务器,办公室如何搭建共享服务器或文件共享服务器
- R - 小鑫の日常系列故事(七)——小纸条
- Pyton爬虫实现豆瓣登陆
- jqGrid----下拉列表框下拉联动,dataEvents回调函数。
- s_p_a_r_k_内核
热门文章
- 最近在修改statusBar,添加几张图片.编译源码包时,一直提示无法找到R.drawable.xxxx必须手动编译下指定的图片文件生成R.
- 百度宣布AI同传最新突破!能预测,低延时,演示效果惊人,外媒称媲美人类翻译...
- 乔丹LeCun李开复隔空对话:我们对智能一无所知;AI研究的12大趋势
- 刻不容缓!联合国加开会议讨论「如何限制杀人机器人」
- loadlin.exe
- 书摘—智能主义:未来商业与社会的新生态
- input type属性为file时(type=file),上传一次然后做更新input的change事件
- 关于router-link包含dom元素会出现Warnings while compiling.警告的问题!
- 基于虚拟帐号的邮件系统extmail(1)
- 50 招教你防止黑客入侵,适用于入门小白到专业人员