装饰器函数:修改增加其他函数功能的函数。
1.不修改原函数的代码
2.一个装饰器函数可以给n个函数添加或修改相同的功能。
装饰器函数的实现方法:
1.它是一个嵌套函数。
2.它也是一个高阶函数,将原函数作为参数,将内部函数作为返回值。
3.将原函数替换为内部函数。原函数在内部函数中执行保留原函数的功能。
案例一:给函数增加"开始执行…“和"结束执行…”
def log_info(function):
def run(*args,**kwargs):
print(“开始执行…”)
res = function(*args,**kwargs)
print(“执行结束…”)
return res
return run
@log_info # 装饰器语法糖
def func1(n):
for i in range(0,n,2):
print(i,end=" ")
print()
return “Ok”
print(func1)
log_info(func1)(20)
有参装饰器(给无参装饰器上再加一层函数用于接收参数。)
案例二 : 执行时间测试函数。计算某函数执行n次的平均时间
import time
def run_time_test(n):
def run_time(function):
def run(*args,**kwargs):
# 1.获取当前时间戳 1970-1-1 00:00:00 (格林威治天文台时间)到现在的秒数。
start_time = time.time()
for i in range(n):
one_time = time.time()
res = function(*args,**kwargs)
print(“第{}执行的时间为:{}”.format(i+1,time.time()-one_time))
t_time = time.time() - start_time
avg_time = t_time / n
print("{}执行的总时间为:{},平均时间为:{}".format(n,t_time,avg_time))
return res
return run
return run_time
@log_info
@run_time_test(10)
def func2(n):
s = 0
for i in range(n):
for j in range(n):
for k in range(n):
s += i * j * k
return s
print(func2(150))
print(log_info(run_time_test(10)(func2))(150))
input()
input()
高阶函数:
1.可以使用函数对象作为参数的函数
2.或可以将函数作为返回值的函数
函数对象:定义好的函数,使用函数名调用(不要加括号) 将函数作为参数的高阶函数,通过传入不同的函数,可以使执行的结果完全不同结果
def add(f,x,y):
return f(x) + f(y)
print(add(lambda x:x**2,3,4))
print(add(lambda x:str(x),3,4))
print(add(lambda x:x/2 ,3,4))
内置高阶函数
map 数据映射函数
map(func,list) -> map生成器对象
将函数作用在list的每一个序列上
res = map(lambda x:x**2,range(10))
print(list(res))
map实现原理
def my_map(f,lis):
new_list = []
for i in lis:
new_list.append(f(i))
return new_list
print(my_map(lambda x:x**0.5,range(1,10)))
reduce 累计函数
from functools import reduce
print(reduce(lambda x,y:x*y,range(1,6)))
input()