闭包和装饰器:
闭包三条件:
- 有嵌套
- 有引用
- 有返回
def outer():
num=20
def inner():
print(num)
return inner
f=outer()
f()#输入20
闭包案例:
'''
闭包编写三步走:① 有嵌套 ② 有引用 ③ 有返回
'''
def outer():
# 定义一个局部变量
num = 10
def inner():
nonlocal num
num += 1
print(num)
return inner
f = outer() # f = inner内存地址(这个时候inner函数中的代码并没有真正的执行)
f() # 11
f() # 12
f() # 13
装饰器:
# 在原有函数的基础上添加一个功能
# check函数有一个参数,fn,要求是一个函数在内存中的地址(只传递函数的名称)
def check(fn):
# fn只能在函数内部使用(局部变量)
def inner():
print('请先登录')
fn()
return inner
# 原有函数:主要功能实现发表评论
@check
def comment():
print('发表评论')
# 原有函数的调用方式
comment()
装饰器的使用场景
-
函数执行时间
import time def get_time(fu): def inner(): begin=time.time() fu() end=time.time() print(str(end-begin)+'s') return inner @get_time def play(): for i in range(1000000): print(i) play()
-
统计日志
装饰器带有参数的函数:
# 目标:为sum_num函数添加一个装饰器,用于输出函数的日志信息
# 装饰器一共分三步:① 有嵌套 ② 有引用 ③ 有返回
def logging(fn):
def inner(n1, n2):
# 输出日志信息
print("--正在努力计算--")
fn(n1, n2)
return inner
@logging
def sum_num(num1, num2):
result = num1 + num2
print(result)
if __name__ == '__main__':
sum_num(10, 20)
装饰带有返回值的函数:
'''
装饰器编写三步走:① 有嵌套 ② 有引用 ③ 有返回
'''
def logging(fn):
def inner(num1, num2):
print('--正在努力进行计算--')
result = fn(num1, num2)
return result
return inner
@logging
def sum_num(a, b):
result = a + b
return result
@logging
def sub_num(a, b):
result = a - b
return result
if __name__ == '__main__':
print(sum_num(10, 20))
print(sub_num(20, 10))
装饰带有不定长参数的函数:
def logging(fn):
def inner(*args,**kwargs):
print('--正常运行--')
return fn(*args,**kwargs)
return inner
@logging
def play(*args,**kwargs):
sum=0
for i in args:
sum+=i
for i in kwargs.values():
sum+=i
return sum
print(play(1,2,3,a=2,c=2))
通用装饰器:
def logging(fn):
def inner(*args,**kwargs):
print('--正在运作--')
return fn(*args,**kwargs)