装饰器(decorator)
- 装饰器的功能就是将被装饰的函数当作参数传递给装饰器对应的函数,并返回包装后的函数。装饰器是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短
- 将函数作为参数传递给另一个函数
def hi():
return 'beauty'
def beauty(a):
print('hi')
print(a)
beauty(hi())
>>hi beauty
- 根据上一个例子,我们来写一个装饰器
def Adecorator(fun):
def wrapper():
print('NO.1',end=' ')
fun() #把Afunction()传进来后,执行fun()就相当于执行Afunction()
print('NO.3',end=' ')
return wrapper
def Afunction()
print('N0.2',end=' ')
Afunction = Adecorator(Afunction) #给装饰器去包装
Afunction() #包装后的函数,执行他就相当于执行wrapper()
>>NO.1 NO.2 NO.3
再将Afunction = Adecorator(Afunction) 换成 @Adecorator(简写),就是了。这就是‘@语法糖’在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便使用。注意只能在定义函数时使用
- 如果Afunction()有参数,可以将参数赋值给内部的wrapper()函数。但这样的话就必须时刻关注Afunction()函数的参数数量,修改Afunction()装饰器也要修改,所以可以用收集参数(*params),对于关键字参数,可以用(**)字典收集
def decorator(func):
def wrapper(*args,**kwargs):
print('{} is running'.format(func.__name__))
return func(*args,**kwargs)
return wrapper
@ decorator
def foo(name, age=None, height=None):
print("I am %s, age %s, height %s" % (name, age, height)).
如果装饰一层不够:@a @b @c def d():
相当于调用a(b(c(d)))
装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用
带参数的修饰器@decorator(a) ,就为装饰器提供了更大的灵活性,就像可以给日志加个等级:
def use_logging(level): #对装饰器函数的一个封装,可以把参数传递到装饰器的环境中
def decorator(func):
def wrapper(*args, **kwargs):
if level == "warn":
print("level warn %s is running" % func.__name__)
elif level == "info":
print("level info %s is running" % func.__name__)
return func(*args)
return wrapper
return decorator
@use_logging(level="warn") #就相当于@decorator
def foo(name='foo'):
print("i am %s" % name)
foo()
>>level warn foo is running
i am foo
注: 装饰器还有对类的装饰,类装饰器具有灵活度大、高内聚、封装性等优点。 等以后复习类的时候在说吧。。。
- 然后我在想,,,为什么要套那么多层,然后试了一下
def wrapper(func,*args, **kw):
print(456)
return func(*args, **kw)
@ wrapper # a=wrapper(a)
def a():
print(123)
456 # 这直接就输出了,在另外调用a() 就会报错对象不可读,,,
123
lambda关键字
- 可以用lambda关键字来创建匿名函数,
lambda x : 2 * x + 1
匿名函数在很大程度上简化了函数的定义过程。基本语法是用冒号(:)分隔函数的参数和返回值,左边放参数,右边放返回值。 - filter() 函数是一个过滤器,有两个参数,第一个参数可以是一个函数也可以是None,如果是函数,第二个可迭代对象里每一个元素作为函数的参数进行运算,把True的值筛选出来,第一个参数是none,直接将第二个参数中为True的值筛选。
list(filter(lambda x : x%2,range(10))) >>>[1,3,5,7,9]
筛选奇数。 - map() 函数,map(func,*iterables),将可迭代对象的每一个元素作为函数的参数进行运算加工,直到可迭代序列每个元素都加工完毕。
list(map(lambda x,y : x+y,[1,3,5],[10,30,50.60])) >>[11,33,55]
map()会从所欲可迭代对象中一次去一个元素组成一个元组,如果长度不一,以短的为基准。
def a(n):
return lambda s : s * n
b = a(2)
print(b(8)) #给内层函数赋值。
print(b('love'))
>>16 lovelove