python中编写无参数decorator
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相关推荐
- python 参数个数 同名函数_如何在python中编写不同参数的同名方法
我在Java背景下学习Python(3.x). 我有一个python程序,我在其中创建一个personObject并将其添加到列表中.p = Person("John") list ...
- python中的无参装饰器和有参装饰器
python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器 ...
- python 超参数_完整介绍用于Python中自动超参数调剂的贝叶斯优化
完整介绍用于Python中自动超参数调剂的贝叶斯优化-1.jpg (109.5 KB, 下载次数: 0) 2018-7-4 23:45 上传 调剂机器学习超参数是一项繁琐但至关重要的任务,因为算法的性 ...
- python使用spark_如何在Python中编写简单代码,并且速度超越Spark?
全文共3482字,预计学习时长7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选择. ...
- python 字节流分段_如何在Python中编写简单代码,并且速度超越Spark?
全文共 3482字,预计学习时长 7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选 ...
- python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递
python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...
- python中编写函数素数_如何用Python编写素数程序?
成为一个认证的专业素数是一个大于1的自然数,它没有除1以外的任何除数.你可以用Python编写一个代码来帮助你找到所有的素数.在本文中,我们将按照以下顺序在Python中编写一个素数程序:什么是素数? ...
- Python中函数的参数传递方式
Python中函数的参数传递方式 .普通的参数传递 >>> def add(a,b):return a+b >>> print add(1,2) 3 >> ...
- 解惑(三)----- 深入理解Python中的self参数和__init__(self)方法--通过类比Java语言
一.前言 在这里我想通过用Python和Java语言的类比来对Python中的self参数和__init__(self)方法做一个深入的解释.这样可以加深对self参数和__init__(self)方 ...
最新文章
- 如何定制一款12306抢票浏览器——用户界面
- winlogon.exe病毒的查杀方法
- 并查集判断是否有环存在
- JSON数据、字符串拼接、宽字符处理、数组、Notice警告、isset和empty、变量、作用域、常量、include和require
- 缺陷架构定义及缺陷管理
- oracle 分组统计行数,求助分组之后进行统计行数
- AngularJS 控制器 ng-controller
- Python 视频教程下载 (全阶段)
- 达梦数据库备份还原使用
- 计算机之父ppt,24计算机之父童年的故事.ppt
- 欧拉公式以及凉鞋问题
- Stacked Hourglass Networks - 堆叠沙漏网络结构详解
- Unity获取系统信息SystemInfo(CPU、显卡、操作系统等信息)
- Cisco Firepower 1000 Series FTD Software 7.2.0 ASA Software 9.18.1
- Unity Navigation
- 用Python操作文件
- 一些有关产品设计的知识点
- 华为C8650刷回官方ROM
- linux环境下安装rar解压程序
- Inner join 写法