Python闭包和装饰器

本文详细介绍了Python中的闭包和装饰器概念。通过实例解析了闭包的三要素:有嵌套、有引用、有返回,并展示了闭包在实际中的应用。接着讲解了装饰器的用途,如何在不修改原有函数代码的基础上添加额外功能,以及装饰器在计算函数执行时间和日志记录等场景的实现。同时,文章还探讨了带参数、返回值和不定长参数的装饰器用法,以及通用装饰器的设计。
摘要由CSDN通过智能技术生成

闭包和装饰器:

闭包三条件:

  • 有嵌套
  • 有引用
  • 有返回
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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值