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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值