Python函数高级用法——闭包和装饰器

一.闭包

闭包的描述

  • 在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。

闭包的构成条件

  • 在函数嵌套(函数里面再定义函数)的前提下
  • 内部函数使用了外部函数的变量(还包括外部函数的参数)
  • 外部函数返回了内部函数

闭包的实例

  • 利用闭包实现对固定数值的加法
    # 定义一个外部函数
    def func_out(num1):
        # 定义一个内部函数
        def func_inner(num2):
            # 内部函数使用了外部函数的变量(num1)
            result = num1 + num2
            print("结果是:", result)
        # 外部函数返回了内部函数,这里返回的内部函数就是闭包
        return func_inner
    
    # 创建闭包实例
    f = func_out(1)
    # 执行闭包
    f(2)        # 结果是: 3
    f(3)        # 结果是: 4
    
  • 利用闭包实现方程的计算
    # 定义外部函数
    def a_line(a, b):
        # 定义内部函数
        def arg_y(x):
            # 函数返回值
            return a*x+b
        # 返回函数
        return arg_y
    
    lin1 = a_line(3, 5)
    print(lin1(10))         # 35
    

二.装饰器

装饰器的描述

  • 给已有函数增加额外功能的函数,它本质上就是一个闭包函数。
  • 不修改已有函数的源代码
  • 不修改已有函数的调用方式
  • 给已有函数增加额外的功能

装饰器实例

  • 利用装饰器实现程序运行时间的计算

    import time
    
    def timmer(func):
        def wrapper():
            start_time = time.time()
            func()
            stop_time = time.time()
            print(f"运行时间是{stop_time-start_time}")		# # 运行时间是3.0026679039001465
        return wrapper
    
    @timmer
    def i_can_sleep():
        time.sleep(3)
    
    i_can_sleep()
    
  • 带有参数的装饰器

    def new_tips(argv):
        def tips(func):
            def nei(a, b):
                print(f"start{argv}", end=' ')
                func(a, b)
                print("stop")
            return nei
        return tips
    
    @new_tips("add")
    def add(a, b):
        print(a+b, end=' ')
    @new_tips("sub")
    def sub(a, b):
        print(a-b, end=' ')
    add(3, 5)       # startadd 8 stop
    sub(3, 5)       # startsub -2 stop
    
  • 装饰器的嵌套使用

import time

def time_print(f):
    def inner(a, b):
        start = time.time()
        time.sleep(3)
        f(a, b)
        end = time.time()
        print(f"程序运行了{end-start}秒")
    return inner

def start_end(f):
    def inner(a, b):
        print("程序开始执行")
        f(a, b)
        print("程序结束执行")
    return inner

@start_end
@time_print
def add_func(a, b):
    print(a+b)

add_func(3, 5)
'''
程序开始执行
8
程序运行了3.0135695934295654秒
程序结束执行
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值