09 第九节课笔记(装饰器)

一、python中装饰器是为了从已存在的函数体上添加新的功能,但不对原函数体做修改

二、为什么函数能够被装饰

1、函数能够作为参数传给另一个函数
2、函数A还可以将函数B作为其返回值

案例一:

def func1(a,b):
    print('【函数func1】正在执行')
    return a + b
def func2(func,c,d): # 参数func是函数func1的形参
    print('【函数func2】生在执行')
    return func(c,d)
# 分别调用函数
print(func1(1, 2))
print(func2(func1, 1, 2))# 在调用func2时把func1作为实参传递给func2的形参func

案例二:

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'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值