def func3(a, b):
print('【函数func3】正在执行')
def func4(): # func4函数相当于func3的一个局部变量,在没有返回给外部前,不能直接调用,但是可以通过调用func3函数来实现调用func4函数。
print('【函数func4】正在运行')
return a + b
print(func4())
func3(10, 20)
案例三:
def A(a, b):
print('【函数A】正在执行')
def B(c): # 内部当函数B返回到函数外部后函数B就可以被调用
print('【函数B】正在执行')
return a + b + c
return B
B = A(10, 20)
print(B)
print(B(30))
无参装饰器
案例:定义一个实现范围内数字进行累加功能的函数
import time
# 测试函数
def inner(func):
def outer(*args, **kwargs):
start1 = time.time()
result = func(*args, **kwargs)
end1 = time.time()
print(f'程序执行花费{end1 - start1}秒')
return result
return outer
def numSum(start, end): # 功能函数
total = 0
for i in range(start, end + 1):
total += i
return total
numSum = inner(numSum) # 1、将功能函数numSum作为实参,传参给inner函数的形参func,;inner执行,先打印outer变量代表的函数,
# 再将outer函数返回,并存储在变量numSum中;因为装饰器函数不能改变功能函数的作用,
# 调用时也就不能改变其函数名,所以赋值变量的时候变量名和函数名是一样的
print(numSum(1,100))
# 传参1和100,因为装饰器是具有通用性的,所以一个装饰器可以调用任何函数,所有的函数传参不一定一致,所以使用不定长参数来接受传参。
# 在outer函数内部又调用了func函数,func函数就是一开始的numSum,将传递的所有参数(*arg,**kwarg)在传递给func函数,真正的调用功能函数numSum
# 最终既得到功能函数应该得到的结果,又能够测试成功功能函数的性能
无参装饰器的标准写法(语法糖写法)
import time
def inner(func):
def outer(*args, **kwargs):
start1 = time.time()
result = func(*args, **kwargs)
end1 = time.time()
print(f'程序执行花费{end1 - start1}秒')
return result
return outer
@inner
def numSum1(start, end):
total = 0
for i in range(start, end + 1):
total += i
return total
print(numSum1(1, 100))
被@的“inner”函数就是装饰器函数,调用时无需在赋值变量,直接调用
有参装饰器和无参装饰器的区别:
1、被@的装饰器函数后是否有参数;
2、有参装饰器,在装饰器函数内部会有两层嵌套的函数
有参装饰器函数案例:
# 可以在函数体执行功能时在多做验证(web权限验证)
def limit(kind): #
def inner(func):
def outer(*args, **kwargs):
result = func(*args, **kwargs)
if result == '登陆成功':
if kind == '会员':
return result,'尊敬的VIP会员'
else:
return result,'感谢白嫖党登录'
return outer
return inner
# 语法糖的参数是登录账号是程序同时验证账号权限得到的结果
@limit('会员') # 有参
# 实现登录验证的装饰器函数
def userLogin(username, pwd):
if username == 'admin' and pwd == '123456':
return '登陆成功'
else:
return '登录失败'
print(userLogin('admin', '123456'))