Python 函数式编程 03 装饰器 & 偏函数

1 装饰器

在代码运行期间动态增加功能的方式,称为“装饰器”(decorator)。

1)实际上,decorator就是一个返回函数的高阶函数。

# 定义一个函数,打印时间字符串
>>> def now():
...     print('2018-7-27')
...
# 获取函数的名字
>>> now.__name__
'now'
# 定义一个decorator
>>> def log(func):
...     def wrapper(*args, **kw):
...         print('call %s():' %func.__name__)
...         return func(*args, **kw)
...     return wrapper
...
# 给now函数加上一个装饰器
>>> @log
... def now():
...     print('2018-7-27')
...
# 调用now函数,显示打印结果
>>> now()
call now():
2018-7-27

2)若装饰器本身需要传入参数

# 定义装饰器
>>> def log(text):
...     def decorator(func):
...         def wrapper(*args, **kw):
...             print('%s %s():' %(text, func.__name__))
...             return func(*args, **kw)
...         return wrapper
...     return decorator
...
# 使用装饰器
>>> @log('execute')
... def now():
...     print('2018-7-27')
...
# 调用函数,显示结果
>>> now()
execute now():
2018-7-27

3)一个完整的装饰器写法,在上面代码中添加一行:@functools.wraps(func)

添加这句话后,再使用装饰器后,now.name就不再是’wrapper’,而是原名。

# 不带参数
>>> import functools
>>> def log(func):
...     @functools.wraps(func)
...     def wrapper(*args, **kw):
...         print('call %s():' %func.__name__)
...         return func(*args, **kw)
...     return wrapper
...
# 带参数
>>> 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
...

2 偏函数

偏函数(Partial function):把一个函数的某些参数固定住(也就是设置默认值),返回一个新函数,调用这个函数会更简单。

示例:

>>> import functools
# 偏函数:转换成二进制
>>> int2=functools.partial(int, base=2)
>>> int2('10000')
16
# 在调用时,可以将参数更改 
>>> int2('10000', base=10)
10000
# 创建偏函数时,实际上可以接受函数对象、*args和**kw3个参数
>>> max2=functools.partial(max,10)
>>> max2(5,6,7)
10

猜你喜欢

转载自blog.csdn.net/lihaogn/article/details/81231750