python中闭包的应用场景

2022-09-30 09:27:42

一、闭包的应用场景

1. 当做计算器使用

2. 统计函数的被调用次数

3. 当做装饰器使用

二、应用场景代码

def calculate():
    """当做计算器使用"""
    num = 0

    def add(value):
        nonlocal num  # 内嵌作用域需要使用nonlocal关键字
        num += value
        return num

    return add


add1 = calculate()
print(add1(5))
print(add1(10))
print(add1(15))

add2 = calculate()
print(add2(3))
print(add2(13))
print(add2(16))

print(add1(70))


def counter(func):
    """统计函数的被调用次数"""
    count = 0

    def closure(*args, **kwargs):
        nonlocal count
        count += 1
        print(f"{func.__name__}被调用了{count}次了")
        return func(*args, **kwargs)

    return closure


def add(a, b):
    print(f"SUM: {a + b}")


def say_hello():
    print("hello")


counter_add = counter(add)
say_hello = counter(say_hello)
counter_add(11, 22)
say_hello()
counter_add(33, 22)
say_hello()
say_hello()
say_hello()
counter_add(33, 22)


def decorator(fn):
    """当做装饰器使用"""
    symbol = '$'

    def closure(*args, **kwargs):
        return symbol + str(fn(*args, **kwargs))

    return closure


@decorator
def add_symbol(number):
    return number


print(add_symbol(200))
print(add_symbol(3000))
print(add_symbol(80000))

二、为什么要使用闭包?

1. 在 Python 中使用闭包的最重要的一点是它们提供某种数据隐藏作为回调函数。这反过来又减少了全局变量的使用。
2. 在某些情况下,使用闭包而不是类可以减少代码大小,节省内存空间。
3. 闭包非常适合替换硬编码常量。
4. 闭包在装饰函数中非常有用。我们在下面的例子中可以看到

参考链接:https://www.codesansar.com/python-programming/closures-applications.htm

三、匿名函数、函数、闭包和对象的区别?

1. 匿名函数:能够完成基本的简单功能,传递的是这个函数的引用,只有功能

2. 函数:普通函数能够完成较为复杂的功能,传递的是这个函数的引用,只有功能

3. 闭包:闭包能够完成较为复杂的功能,传递的是这个闭包中的函数及数据,因此传递的是功能+数据

4. 对象:能够完成最为复杂的功能,传递的是很多数据+很多功能,因此传递的是功能+数据

  • 作者:专职
  • 原文链接:https://mayanan.blog.csdn.net/article/details/120115930
    更新时间:2022-09-30 09:27:42