Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。

使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = decorate(f) 这样的代码。

考察一个@log的定义:

def log(f):def fn(x):print 'call ' + f.__name__ + '()...'return f(x)return fn

对于阶乘函数,@log工作得很好:

@log
def factorial(n):return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

结果:

call factorial()...
3628800

但是,对于参数不是一个的函数,调用将报错:

@log
def add(x, y):return x + y
print add(1, 2)

结果:

Traceback (most recent call last):File "test.py", line 15, in <module>print add(1,2)
TypeError: fn() takes exactly 1 argument (2 given)

因为 add() 函数需要传入两个参数,但是 @log 写死了只含一个参数的返回函数。

要让 @log 自适应任何参数定义的函数,可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用:

def log(f):def fn(*args, **kw):print 'call ' + f.__name__ + '()...'return f(*args, **kw)return fn

现在,对于任意函数,@log 都能正常工作。

练习:

编写一个@performance,它可以打印出函数调用的时间

import time
def performance(f):a = time.time()def fn(*argc, **kw):print f(*argc, **kw)print time.time() - areturn fn
@performance
def factorial(n):return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

结果:

3628800
0.0189998149872
None

转载于:https://www.cnblogs.com/Lambda721/p/6128965.html

python中编写无参数decorator相关推荐

  1. python 参数个数 同名函数_如何在python中编写不同参数的同名方法

    我在Java背景下学习Python(3.x). 我有一个python程序,我在其中创建一个personObject并将其添加到列表中.p = Person("John") list ...

  2. python中的无参装饰器和有参装饰器

    python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器 ...

  3. python 超参数_完整介绍用于Python中自动超参数调剂的贝叶斯优化

    完整介绍用于Python中自动超参数调剂的贝叶斯优化-1.jpg (109.5 KB, 下载次数: 0) 2018-7-4 23:45 上传 调剂机器学习超参数是一项繁琐但至关重要的任务,因为算法的性 ...

  4. python使用spark_如何在Python中编写简单代码,并且速度超越Spark?

    全文共3482字,预计学习时长7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选择. ...

  5. python 字节流分段_如何在Python中编写简单代码,并且速度超越Spark?

    全文共 3482字,预计学习时长 7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选 ...

  6. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  7. python中编写函数素数_如何用Python编写素数程序?

    成为一个认证的专业素数是一个大于1的自然数,它没有除1以外的任何除数.你可以用Python编写一个代码来帮助你找到所有的素数.在本文中,我们将按照以下顺序在Python中编写一个素数程序:什么是素数? ...

  8. Python中函数的参数传递方式

    Python中函数的参数传递方式 .普通的参数传递 >>> def add(a,b):return a+b >>> print add(1,2) 3 >> ...

  9. 解惑(三)----- 深入理解Python中的self参数和__init__(self)方法--通过类比Java语言

    一.前言 在这里我想通过用Python和Java语言的类比来对Python中的self参数和__init__(self)方法做一个深入的解释.这样可以加深对self参数和__init__(self)方 ...

最新文章

  1. 如何定制一款12306抢票浏览器——用户界面
  2. winlogon.exe病毒的查杀方法
  3. 并查集判断是否有环存在
  4. JSON数据、字符串拼接、宽字符处理、数组、Notice警告、isset和empty、变量、作用域、常量、include和require
  5. 缺陷架构定义及缺陷管理
  6. oracle 分组统计行数,求助分组之后进行统计行数
  7. AngularJS 控制器 ng-controller
  8. Python 视频教程下载 (全阶段)
  9. 达梦数据库备份还原使用
  10. 计算机之父ppt,24计算机之父童年的故事.ppt
  11. 欧拉公式以及凉鞋问题
  12. Stacked Hourglass Networks - 堆叠沙漏网络结构详解
  13. Unity获取系统信息SystemInfo(CPU、显卡、操作系统等信息)
  14. Cisco Firepower 1000 Series FTD Software 7.2.0 ASA Software 9.18.1
  15. Unity Navigation
  16. 用Python操作文件
  17. 一些有关产品设计的知识点
  18. 华为C8650刷回官方ROM
  19. linux环境下安装rar解压程序
  20. Inner join 写法

热门文章

  1. ActiveMQ学习笔记(8)——导入ActiveMQ源码到Eclipse
  2. 【翻译】Ext JS最新技巧——2014-8-13
  3. Android的目录结构说明
  4. KMP算法的实现以及改进
  5. 51CTO采访Cisco专家何凌:实现整体虚拟化
  6. linux 安装mysql
  7. 打包phar文件过大的问题。
  8. laydate 使用
  9. SQLite的Pragma语句
  10. Android与服务器端数据交互(转)