当一个嵌套函数引用了它外部函数的变量时,就形成了一个闭包。闭包可以让函数保留状态并在不同调用中记住这些状态。Python语言提供了函数返回函数的方法,可以用于构造函数式编程中的高阶函数和装饰器等。
本文将详细解释Python闭包的概念并给出相关的示例代码。
Python闭包的概念
Python中的闭包是指,在嵌套函数中引用了它外部函数的变量,并返回该内部函数的情况。闭包中的外部函数变量可以是不可变的(如数字、字符串、元组等),也可以是可变的(如列表、字典等)。
理解Python闭包的关键在于:内部函数可以访问外部函数的局部变量,即使外部函数已经返回结束,内部函数仍然可以访问在外部函数期间定义的变量。
示例1: 计数器
下面是一个示例,说明了嵌套函数和Python闭包之间的关系,它可以用来实现一个简单的计数器。
def counter():
count = 0
def inc():
nonlocal count
count += 1
return count
return inc
c = counter()
print(c()) # 1
print(c()) # 2
print(c()) # 3
在上面的示例中,建立了一个嵌套函数,inc()
可以访问外层函数的变量count
,并且每次调用inc()
函数时,count
变量都会递增,在这里实现了一个计数器。
在计数器示例中,当我们调用外部函数 counter()
时,返回内部函数 inc()
,并将其存储在变量 c
中。我们可以通过调用变量 c()
来增加计数器的值。
Python闭包的应用
Python闭包广泛应用于高阶函数和装饰器中。下面是一个简单的示例,演示如何使用装饰器改变函数的行为。
示例2: 装饰器
import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
t1 = time.time()
result = func(*args, **kwargs)
t2 = time.time()
print(f"Function name: {func.__name__}, Executed in {t2-t1} seconds")
return result
return wrapper
@timing_decorator
def my_func():
time.sleep(1)
return 'Done'
my_func() # Function name: my_func, Executed in 1.0009074211120605 seconds
在上面代码示例中,使用装饰器@将my_func()函数包装在 timing_decorator()
函数中。在wrapper()
函数内部,使用起始和结束时间记录函数运行时间。
总结
本文介绍了Python闭包,它可以使我们在函数外部保留状态并记住它们,使用这个特征,可以在可调用对象和装饰器中创建更高级别的函数。本文还提供了两个简单的示例,展示了嵌套函数和装饰器如何使用闭包实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python闭包之返回函数的函数用法示例 - Python技术站