1.函数的可变参数
def f(*args, **kw):
*:代指元组,长度不限
**:代表键值对,个数不限
def f(*args, **kw):
print len(args)
print args
for i in kw:
print i:kw[i]
f(1,a,2,name='wu', age=111)
#输出:
'''
3
1,a,2
name=wu
age=111
'''
2.自定义装饰器
让函数作为装饰器函数的参数,达到装饰函数的效果(函数命名随意)..用try...except,进行异常捕获,然后再外嵌一个带参数的函数来重跑(参数用于设定最多重跑的次数)
来分析这个式子, 可以看出至少要满足以下几个条件
1. 装饰器函数运行在函数定义的时候
2. 装饰器需要返回一个可执行的对象
3. 装饰器返回的可执行对象要兼容函数f的参数
被装饰器函数修饰的函数,将会作为参数传入装饰器函数中,目的是使代码更加简洁。
import time
def decorator(max):
def _decorator(fun):
def wrapper(*args, **kwargs):
start = time.time()
for i in xrange(max):
fun(*args, **kwargs)
runtime = time.time()-start
print runtime
return wrapper
return _decorator
# 循环f()函数两次
@decorator(2)
def do_something(name):
for i in range(1000000):
pass
print "play game " + name
do_something("san guo sha")
---------------------
#本文来自 TangHuanan 的CSDN 博客 ,全文地址请点击:#https://blog.csdn.net/TangHuanan/article/details/45094497?utm_source=copy
3.自适应参数-装饰器
# 装饰器-记录函数是否运行
def running_log(arg):
if callable(arg): # callable判断arg是否为函数,类等可调用对象
@functools.wraps(arg) # 保证被装饰的实体名,没有被替换
def _demo(*args, **kwargs):
print('%s is running!' % arg.__name__)
return arg(*args, **kwargs)
return _demo
else:
def _demo(func):
@functools.wraps(func)
def __demo(*args, **kwargs):
if arg == 'warning':
print('warning: %s is running!!' % func.__name__)
return func(*args, **kwargs)
return __demo
return _demo
# 灵活参数装饰器使用
# 装饰器不带参数
@running_log
def No_arg(a, b):
print(a + b)
@running_log('warning')
def Have_arg(a, b):
print(a + b)
No_arg(1, 2)
Have_arg(3, 4)
运行结果: