16.python函数式编程(三)—装饰器,偏函数

3)装饰器

有点懵,说实话,没怎么看懂。先说一下,什么事装饰器。装饰器是我们想要加强一个函数的功能,但是又不想改变他之前的函数定义。我理解的大致原理大概是,先改名字,再改名字,再取名字。实际上,装饰器是一个高阶函数。示例代码如下:

def log(func):
    def wrapper(*args, **kw):
        print 'call %s():' % func.__name__
        return func(*args, **kw)
    return wrapper
@log
def now():
    print '2018-3-18'
 now()

这里的@log相当于now=log(now)。我们先把原作者的解释贴下来:


有点懵是吧,我们从头开始。现在调用now()函数,now函数是存在的。但是now()的函数名,指向了一个新的函数。也就是说,现在两个函数叫一个名字。调用now(),将执行另一个加强版的now(也就是wrapper),因为wrapper是接收两个参数,一个是可变参数,一个是关键字参数。所以可以接受任意参数。接下来,打印日志,我们注意到这里,return func,即返回原始函数now()。这样now函数便保留下来了。而外面的return wrapper,返回了加强版的now(也就是wrapper)。

通俗点讲的话,先把now函数的名字给别人,然后别人用完了再还给now函数。这个人谁呢?就是wrapper。

上面讲的是两层嵌套。下面还有三层嵌套,示例代码如下:

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-3-18

这里:now = log('execute')(now)。

我们继续分析:

首先执行log('execute'),返回decorator函数。然后调用参数,参数是now()。打印,再保留now函数。再返回wrapper。

我们这里要注意:函数也是对象。他有属性,但是经过装饰的函数,属性已经变了,比如

now.__name__
'wrapper'

这里需要把原始函数的属性,复制到wrapper中。

4)偏函数

这里的偏函数就是把一个函数的某个参数固定住,然后再定义一个函数,方便使用。示例代码如下:

import functools
int2 = functools.partial(int, base=2)
int2('1000000')
64
int2('1010101')
85
这里偏函数的功能字是:functool.partial。

希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值