python中高阶函数与装饰器(3)

>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28> >>> f(5) 25

def f(x):
    return x * x

关键字lambda表示匿名函数,冒号前面的x表示函数参数。

匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

import time
def foo():
print("foo...")

#遵守开放封闭原则对原有函数不能直接修改

def show_time(func):
start = time.time()
func()
end = time.time()
print('spend time %s' % (end-start))
用其他函数直接调用会使函数名更换

def logger(flag =''):
def show_time(f):
def inner(*args):
start = time.time()
f(*args)
end = time.time()
print('speed %s'%(end-start))
if flag == 'true':
print('日志记录')
return inner
return show_time
#添加装饰器函数


@logger('true')#foo = show_time(foo)
def foo():
print("foo...")
time.sleep(2)

@logger()#bar =show_time(bar)
def bar():
print('foo,,,')
time.sleep(2)

#@show_time#foo = show_time(foo)
def add(*args):
sum=0
for i in args:
sum+=i
print(sum)
time.sleep(1)

add(1,2,4,4)

此时函数的_name_属性已经改变

import functools

def log(text):
    def decorator(func):
        @functools.wraps(func)#此语句将返回的wrapper函数名的_name_属性改为func
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

原文地址:https://www.cnblogs.com/MY0213/p/7766794.html