匿名函数

关键字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 匿名函数装饰器相关推荐

  1. python中tracer函数意思_浅析Python编写函数装饰器

    本节主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. 这是一个通过类装饰的语法写成的装饰器,测试如下: 运 ...

  2. Python笔记-函数装饰器

    在调用某个方法前,想调用一些额外的东西. 个人感觉就和C++里面,带一个函数指针的的参数,在某个函数执行前,调用这个函数指针,或者,在某个函数中,直接调用这个函数.比如插入日志等.功能. 但在pyth ...

  3. python 闭包_一起看流畅的python:函数装饰器和闭包

    装饰器 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数).装 饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个 函数或可调用对象. 装饰器的一个关键特性是,它们在被装饰的函数定义 ...

  4. Python笔记-函数装饰器的缺点

    装饰器的好处,复用了代码,缺点就是原函数的元信息不见了 比如函数docstring._name_.参数列表 如下代码: def use_logging(level = "debug" ...

  5. python装饰器函数-Python函数装饰器指南

    Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...

  6. python函数修饰器_Python函数装饰器指南

    Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...

  7. python函数装饰器详解_Python语言函数装饰器用法实例详解

    这篇文章主要介绍了Python语言函数装饰器用法,以实例形式较为详细的分析了Python函数装饰器的常见使用技巧,需要的朋友可以参考下,希望对大家学习Python语言有所帮助. 本文实例讲述了pyth ...

  8. python三大神器装饰器_Python2.x

    1)自动化 2)python编写的 openstack jumpserver ansible SaltStack yuanj zabbix json docker yaml 2)The Zen of ...

  9. Python中的装饰器、迭代器、生成器、推导式、匿名函数和高阶函数

    文章目录 装饰器 迭代器 生成器 推导式 匿名函数 高阶函数 装饰器 闭包 介绍装饰器前先了解一下闭包,在Python中,一切皆对象(Object),函数(Function)也不例外,也是一个普通的对 ...

最新文章

  1. 测试结果分析_9种国内外纺织品耐摩擦色牢度测试方法结果分析
  2. html5 form表单,html5 教程
  3. 简单快速开发C\S架构程序用最简单的不分层最快的效率达到功能要求的例子程序FrmKnowledge日积月累功能的实现...
  4. Linq to SQL只支持SQL Server(所选对象使用不支持的数据提供程序)
  5. [html] 写一个类似刮刮卡效果的交互,即鼠标划过时显示号码
  6. C++链表插入节点函数为什么要传递头节点的二维指针
  7. 披荆斩棘:饿了么业务架构的演进之路
  8. 咪蒙,毕业两年成阿里P7,不止阿里HR不同意......
  9. Caffe学习:使用pycaffe生成mean_file.py文件
  10. 软件开发学什么编程语言好
  11. 科学计算机计算等比求和公式,等比数列求和公式
  12. 再见所有的翻译工具!我使用了有道智云+Python开发一个批量文档翻译工具,老大对我赞不绝口
  13. 配置打印机共享时 报错 无法访问您可能没有权限使用网络资源
  14. kpi绩效考核流程图_XX公司KPI绩效考核案例.doc
  15. MATLAB---绘制三维图形函数实例介绍
  16. 计算机网络共享服务器,办公室如何搭建共享服务器或文件共享服务器
  17. R - 小鑫の日常系列故事(七)——小纸条
  18. Pyton爬虫实现豆瓣登陆
  19. jqGrid----下拉列表框下拉联动,dataEvents回调函数。
  20. s_p_a_r_k_内核

热门文章

  1. 最近在修改statusBar,添加几张图片.编译源码包时,一直提示无法找到R.drawable.xxxx必须手动编译下指定的图片文件生成R.
  2. 百度宣布AI同传最新突破!能预测,低延时,演示效果惊人,外媒称媲美人类翻译...
  3. 乔丹LeCun李开复隔空对话:我们对智能一无所知;AI研究的12大趋势
  4. 刻不容缓!联合国加开会议讨论「如何限制杀人机器人」
  5. loadlin.exe
  6. 书摘—智能主义:未来商业与社会的新生态
  7. input type属性为file时(type=file),上传一次然后做更新input的change事件
  8. 关于router-link包含dom元素会出现Warnings while compiling.警告的问题!
  9. 基于虚拟帐号的邮件系统extmail(1)
  10. 50 招教你防止黑客入侵,适用于入门小白到专业人员