闭包函数
- 闭包的内部函数中,对外部作用域的变量进行引用
- 闭包无法修改外部函数的局部变量
- 闭包可以保存当前的运行环境
# 普通方法实现
def output_student(name, gender, grade=1):
print(F"新学期开学啦,学生{name}是{gender},他是{grade}年级学生")
output_student('李白', '男生')
output_student('赵云', '男生')
output_student('孙尚香', '女生')
代码语言:python代码运行次数:0复制# 闭包函数
def student_grade(grade):
def output_student(name, gender):
print(F"新学期开学啦,学生{name}是{gender},他是{grade}年级学生")
return output_student
student_info = student_grade(3)
student_info('李白', '男生')
student_info('赵云', '男生')
student_info('孙尚香', '女生')
需求:在函数调用的时候打印函数开始和函数结束
代码语言:python代码运行次数:0复制def aaa():
print('good good study, happy happy everyday')
def bbb():
print('everything is ok')
# 把中间的执行函数使用参数替代
def function_tips(func):
print("函数开始执行")
# 不写死函数,使用外部调用的方式
func()
print("函数结束执行")
# 传入一个函数对象
function_tips(bbb)
代码运行步骤:
func参数等于上方的bbb函数,下方调用func就等于调用bbb函数,然后把bbb的内容带入func
最后执行代码实现
使用装饰器实现
代码语言:python代码运行次数:0复制# 使用装饰器实现
# 闭包定义,1、定义两个函数,一个内函数,一个外函数,timer是外函数
# 5、在装饰器执行的过程中传入一个参数,这个参数就是被装饰函数的对象
def timer(func):
# inner作用:执行装饰器的逻辑;inner是内函数
def inner():
# 2、在内函数里面添加装饰器的逻辑
print("代码开始运行")
func() # 6、添加被装饰函数的执行步骤
print("代码结束运行")
# 3、把内函数返回出去,之后可以被调用
return inner
# 4、装饰器的使用:@ 装饰器名称
@timer
def aaa():
print('ccccc')
aaa()
---------->
代码开始运行
ccccc
代码结束运行
装饰器的练习
题目:实现一个计时器的装饰器,计算函数的执行时间
代码语言:python代码运行次数:0复制import datetime
def timer(func):
def inner():
# 获取当前时间
start_time = datetime.datetime.now()
func()
# 获取结束时间
end_time = datetime.datetime.now()
print(f"函数执行时间{end_time - start_time}")
return inner
@timer
def calc():
print("aaaaaaa")
calc()
------------------------------->
aaaaaaa
函数执行时间0:00:00
被装饰函数存在参数怎么解决
代码语言:python代码运行次数:0复制# 装饰器的练习
# 题目:实现一个计时器的装饰器,计算函数的执行时间
import datetime
def timer(func):
"""
1、如果装饰器内有参数,需要写在内置函数内,在调用的时候也要带上
2、如果写死一个参数,但无法确定被装饰器的参数数量,这种写法会报错
3、解决方法:把两个地方的参数全部换成不定长参数*args, **kwargs
:param func:
:return:
"""
def inner(*args, **kwargs):
# 获取当前时间
start_time = datetime.datetime.now()
func(*args, **kwargs)
# 获取结束时间
end_time = datetime.datetime.now()
print(f"函数执行时间{end_time - start_time}")
return inner
@timer
def calc(name, age, gender):
print("aaaaaaa")
print(name)
print(age)
print(gender)
calc('lili', 3, "女")
-------------------------------->
aaaaaaa
lili
3
女
函数执行时间0:00:00