匿名函数,不需要以定义的方式构造函数,直接传入计算方式,在前面map()和reduce()中遇见的lambda即是匿名函数。如map(lambda x: x*x,[1,2,3]),相当于定义函数中的return x*x,(x=1,2,3)。
匿名函数函数的特点:①匿名函数只能有一个表达式,返回值就是该表达式的结果。②因为没有定义,所以匿名函数没有函数名的冲突。③匿名函数作为一个函数对象可以赋值给一个变量,再利用变量来调用该函数。④匿名函数可以作为返回值返回。
装饰器,指的是不修改某函数的定义,在函数调用运行的时候动态增加功能的方式,就称之为装饰器(Decorator)。本质上,装饰器是返回函数。
.__name__,是函数对象的一个属性,可以知道函数的函数名。如,now.__name__,返回'now'。
函数wrapper(*args,**kw)中的*args是可变参数(可变参数,指传入的元素数量可变,方式可直接),**kw是命名关键字函数(限制的关键字参数,即限制了参数名,含参数名的参数),具体回顾函数的参数。 其实在例子中,两种参数的定义在这样并没有多大意义,后面仍可以继续调用wrapper()。
%s,是字符串占位符,替换为后一个%后面的内容。
@语法:@log放在函数定义处,相当于执行了now=log(now)的语句。@可以实现多层嵌套,例子中的@log('execute')其实就相当于now=log('execute')(now),至此可以看出,(now)这个参数是在@符号后面这一个整体上增加的。所以这个@的两层嵌套是这样实现的。
在now()函数被装饰之后,now.__name__这一属性将被改变(未知原因)。这个时候为防止后续出现代码错误,需要把now()函数的这一属性改过来,将这一属性复制到wrapper的运行当中去。可以通过wrapper.__name__ = func.__name__来实现,但在python中有专门的模块可以实现:functools.wraps便是。这个需要从functools模块中import。使用的方式是在函数装饰的时候,@functools.wraps()。
这样实现func.__name__这一属性就不会给改变了。
习题中的要在函数调用前后出现两行语句,可以在定义过程中去掉return,直接插入
如图在wrapper的定义里,没有return,但后面也返回了到了now()这一个原函数,说明这样是可行的。
对于有text和无text的,通过if语句来完成,结合教程中的@log和@log('execute')可以得出:
特别注意,无text时,要对func这一个参数赋值。
装饰器的讲解http://mp.weixin.qq.com/s/D046S6jVYs-rlAvgVbwlsA
网友评论