欢迎访问宙启技术站
智能推送

Python闭包函数的介绍与应用

发布时间:2023-06-14 01:48:21

Python闭包是一个很有趣的概念,在许多语言中都有实现,它涉及到函数和变量的作用域问题,可以让我们在编写代码时更加灵活地利用函数。

首先让我们来了解闭包的概念,闭包就是一个函数,它返回一个函数,且返回的函数可以访问其创建者的变量。例如:

def make_adder(x):
    def adder(y):
        return x + y
    return adder

add5 = make_adder(5)
add10 = make_adder(10)

print(add5(3)) #=> 8
print(add10(3)) #=> 13

在上面的例子中,make_adder 返回函数 adder,而 adder 访问了 make_adder 的变量。当调用 make_adder(5) 时,变量 x 被赋值为 5,然后返回函数 adder,这个函数可以访问 make_adder 的变量 x,也就是 5,此时我们可以将这个函数赋值给变量 add5。同理当调用 make_adder(10) 时,我们可以将返回的函数赋值给变量 add10

调用 add5(3)add10(3) 分别返回 813。这就是闭包函数的应用场景之一:实现工厂函数。

通过闭包函数,我们可以创建工厂函数,用于构造具有相同性质的对象。例如:

def make_counter():
    count = 0
    
    def counter():
        nonlocal count
        count += 1
        return count
    
    return counter

counterA = make_counter()
counterB = make_counter()

print(counterA()) #=> 1
print(counterA()) #=> 2
print(counterB()) #=> 1
print(counterA()) #=> 3

在上面的例子中,我们定义了一个用于计数的闭包函数 make_counter,这个函数里有一个变量 count,被内部函数 counter 访问。counter 函数使用了关键字 nonlocal 声明变量 count 不是局部变量,这样就可以在函数内部赋值给 count

当调用 make_counter() 时,返回内部函数 counter,然后我们可以像调用普通函数一样,分别赋值给变量 counterAcounterB。此后我们可以分别通过这两个变量调用 counter 函数,每次调用都会使变量 count 的值增加 1。

闭包函数还可以用于实现装饰器,装饰器是一种基于函数的配件,可以使被装饰的函数具有其他属性,如日志记录、缓存等功能,例如:

def log(func):
    def wrapper(*args, **kwargs):
        print("function {} is called".format(func.__name__))
        return func(*args, **kwargs)
    return wrapper

@log
def my_func(x):
    return x + 1

print(my_func(5)) #=> 6

在上面的例子中,我们定义了一个叫做 log 的闭包函数,输入参数是另一个函数 func。在内部定义另一个函数 wrapper,这个函数包装了传入的函数 func。当调用被包装的函数时,会在控制台输出日志信息,并调用函数 func 计算返回值。

通过使用装饰器 @log,我们可以将 my_func 函数传入 log 函数中包装,这样每次调用 my_func 函数都会输出日志信息,方便调试和分析。

总结一下,闭包函数是 Python 语言中的一个重要概念,在许多实践中都有广泛的应用。通过闭包函数,我们可以创建工厂函数、实现装饰器、以及其他一些有趣的语法。熟练掌握闭包函数的概念,可以在编写 Python 程序时提高代码的复用性和可维护性。