高阶函数
- 接收函数作为参数
- 或者将函数作为返回值返回的函数
def fun1(n):
if n % 2 == 0:
return True
def fun2(n):
if n > 3:
return True
def fun(lst, fn):
new_list = []
for i in lst:
if fn(i):
new_list.append(i)
return new_list
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(fun(list1, fun1))
print(fun(list1, fun2))
匿名函数
def fun(a, b):
return a + b
# 可以用如下方式匿名
res = (lambda a, b: a + b)
print(res(1, 2))
闭包
- 函数嵌套
- 将内部函数作为返回值返回
def fun_out(num1):
def fun_inner(num2):
nonlocal num1 # 告诉解释器不用本地变量
num1 = 10
res = num1 + num2
return res
print(num1)
fun_inner(1)
print(num1)
return fun_inner
r = fun_out(1)
r(1)
print(r(1))
运行结果
1
10
11
装饰器
# 装饰器是一个闭包
def fun_out(old):
def fun_inner(*args, **kwargs):
print('程序开始执行了')
print(old(*args, **kwargs))
print('程序执行结束了')
return fun_inner
@fun_out
def add(a, b):
return a + b
add(1, 2)
运行结果
程序开始执行了
3
程序执行结束了
PEP8规范
作业
- 请使用装饰器实现已存在的函数的执行所花费的时间。
time模块
# 定义计时装饰器
def run_time(old):
def fun_inner(*args, **kwargs):
time1 = time.time()
print('{}秒程序开始执行了'.format(time1))
print(old(*args, **kwargs))
time2 = time.time()
print('{}秒程序执行结束了'.format(time2))
print('执行时间是{}秒'.format(time2-time1))
# print("程序执行花了{}".format(time2 - time1))
return fun_inner
@run_time
def fun(m, n):
list1 = []
for i in range(m):
for j in range(n):
list1.append([i, j])
return 'abc'
fun(100, 100)
运行结果
1620449468.3109941秒程序开始执行了
abc
1620449468.3129866秒程序执行结束了
执行时间是0.001992464065551758秒
递归函数的装饰有区别
def Sum(n):
if n == 1:
return 1
return n + Sum(n - 1)
@run_time
def fun1(n):
return Sum(n)
fun1(800)
运行结果
1620450307.4638147秒程序开始执行了
320400
1620450307.4648116秒程序执行结束了
执行时间是0.0009968280792236328秒