闭包函数
什么是闭包函数:
闭包函数是 函数嵌套、函数对象、名称空间与作用域 结合体
闭包函数注意事项:
- 闭包函数必须在函数内部定义
- 闭包函数可以引用外层函数的名字
#直接传参
def func(x):
print(x)
func(1000)
1000
#通过闭函数传参
def outer(number):
def inner():
print(number)
return inner
func = outer(1000) # --->inner地址 ----> func变量名
func() #---> inner地址
装饰器
什么是装饰器 : 在函数中用来给添加新功能的工具
为什么要用装饰器:
为了提高代码的可读性,防止代码的冗余
怎么用装饰器:
- 不修改被装饰对象的源代码
- 不修改被装饰对象的调用方式
被装饰对象: -----> 需要添加功能 函数
装饰器:------> 被装饰对象添加的新功能 的 函数
time_record --- > 装饰器
# 统计下载电影函数的运行时间
import time
def download_movie():
print('电影开始下载...')
time.sleep(3)
print('电影下载完成...')
start_time = time.time()
download_movie()
end_time = time.time()
print(f'消耗时间:{end_time - start_time}')
电影开始下载...
电影下载完成...
消耗时间:3.000986099243164
# 装饰器写法:
import time
def download_movie():
print('电影开始下载...')
time.sleep(3)
print('电影完成下载...')
def time_record(func):
def inner():
start_time = time.time()
func()
end_time = time.time()
print(f'消耗数间:{end_time - start_time}')
return inner
download_movie = time_record(download_movie)
download_movie()
装饰器的语法糖 ,是属于装饰器的
@: 装饰器的语法糖
注意: 在使用装饰器语法糖时,装饰器必须定义在被装饰对象之上
import time
#统计函数执行时间装饰器
def wrapper(func):
def inner(*args, **kwargs):# 被装饰对象
#调用前新增功能
start_time = time.time()
#调用被装饰对象,并接收返回值
res = func(*args, **kwargs)
#调用后添加新功能
end_time = time.time()
print(end_time - start_time)
return res
return inner