16.python函数式编程(三)—装饰器,偏函数
2018-03-18 17:44
127 查看
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中。
[b]4)偏函数[/b]这里的偏函数就是把一个函数的某个参数固定住,然后再定义一个函数,方便使用。示例代码如下:import functools
int2 = functools.partial(int, base=2)
int2('1000000')
64
int2('1010101')
85这里偏函数的功能字是:functool.partial。
希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正。
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中。
[b]4)偏函数[/b]这里的偏函数就是把一个函数的某个参数固定住,然后再定义一个函数,方便使用。示例代码如下:import functools
int2 = functools.partial(int, base=2)
int2('1000000')
64
int2('1010101')
85这里偏函数的功能字是:functool.partial。
希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正。
相关文章推荐
- python全栈开发-Day10 装饰器(闭合函数的应用场)
- 16. 函数指针
- python_装饰器二(对有/不定长参数函数的装饰)
- 装饰器--对同一个函数进行两次进行装饰,函数执行顺序
- 完善装饰器函数
- 【函数】06、装饰器的应用
- js fun.apply 装饰器(重新定义一个函数)
- python函数式编程-----序列处理函数:map(),filter(),reduce()
- Python函数式编程指南(二):函数
- 函数对象、函数嵌套、名称空间与作用域、装饰器
- Python函数式编程指南(二):从函数开始
- 装饰器学习笔记3:简单的函数装饰器
- python函数式编程:apply, map, lambda和偏函数
- python装饰器和偏函数联合运用碰到的问题
- Python函数式编程简介(二)返回函数
- @classmethod, @staticmethod和@property这三个装饰器的使用对象是在类中定义的函数。下面的例子展示了它们的用法和行为:
- Python实现对一个函数应用多个装饰器的方法示例
- Python: 使用装饰器“@”取得函数执行时间
- Python中几个挺好用的东西(函数、类、装饰器)
- python之 装饰器(原函数有返回值,装饰器函数如何拿到原函数返回值?)