Python中的闭包和修饰器

闭包

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

闭包形成条件

  1. 在函数嵌套(函数里再定义函数)的前提下;
  2. 内部函数使用了外部函数的变量(包括外部函数的参数)
  3. 外部函数返回了内部函数

闭包的作用

  • 闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁
  • 闭包的好处是将外层函数的变量和内层函数进行了绑定,防止其他函数对变量的修改

举例说明

​题目:例如构造一个函数sum实现a和b两个数相加,且统计该函数共调用多少次:

""" 不使用闭包: """
int num = 0

def sum(a, b):
    global num
    num += 1
    print(f'共运行了:{num}次')
    return a + b

sum(2, 3)

# -----------------------------------------------------

""" 使用闭包: """
# 定义外部函数
def func_outer():
    num = 0
    def sum(a, b):
        nonlocal num
        num += 1
        print(f'共运行了:{num}次')
        return a + b
    return sum

func = func_outer()
func(2, 3)

总结:由以上示例可见,不使用闭包时需要定义一个全局变量,可能会导致在其他步骤中改变该全局变量的值,致使数据不准确;而闭包中外部函数定义的参数只能在外部函数以及内部函数中使用,不会因其他地方操作失误而改变,所以闭包可以完美解决这个问题。

装饰器

定义:给已有函数增加额外的功能,其本质是一个闭包函数

修饰器的功能特点

  1. 不修改已有函数的代码
  2. 不修改已有函数的调用方式
  3. 给已有函数增加额外的功能

举例说明

​题目:例如有一个函数func1已被定义,需要在其中添加方法:统计函数运行的时间并打印:

import time

""" 不使用修饰器:"""
def func1():
    pass

t1 = time.time()
func1()
t2 = time.time()
print(t2 - t1)

# -------------------------------------------------------

""" 使用修饰器:"""
def func1():
    pass

def get_time(func):
    def func_inner():
        t1 = time.time()
        func()
        t2 = time.time
        print(t2 - t1)
    return func_inner

func1 = get_time(func1)
func1()

总结:由以上示例可见,如果不使用修饰器时代码冗余,且用起来复杂;而使用修饰器的程序调用方便,没有多余的操作。

补:修饰器的语法糖写法

​ 特点:通过使用 @修饰器名字,去掉多余的调用函数语句

​ 效果:示例同上

import time

def get_time(func):
    def func_inner():
        t1 = time.time()
        func()
        t2 = time.time
        print(t2 - t1)
    return func_inner

# 此处的 @get_time 相当于前面的 func1 = get_time(func1)
@get_time
def func1():
    pass

# 使用语法糖后直接调用函数即可实现
func1()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值