闭包(Closure)

简介: 闭包(Closure)

闭包(Closure)是指在一个作用域内定义的函数,该函数可以访问并调用定义在其作用域内的变量和函数,并在函数被返回后仍然可该访问这些定义。闭包可以用于装饰器和工厂函数等几乎所有的高级应用场景。

以下是一个简单的闭包的例子:

def outer_func(x):
    def inner_func(y):
        return x + y
    return inner_func

test = outer_func(10)  # test现在是inner_func的引用
print(test(5))  # output:15
print(test(2))  # output:12

在上面的代码中,我们定义了两个函数: outer_funcinner_func。inner_func是由outer_func创建的,inner_func可以访问 outer_func 的变量 x,并且仍然具有对 x 的访问权限。

因此,当我们通过调用 outer_func(10) 创建一个新的实例并将其分配给变量 test 时, test() 实际上引用了一个现有的 inner_func 对象,x=10。然后我们通过两次调用 test() 来分别测试 test 返回的两个结果,每个结果都通过对 outer_funcinner_func 定义的变量 x 进行求和得出。

应用闭包的一个常见方式是使用闭包实现装饰器。装饰器是处理其他函数的函数的函数,是一个将一个函数作为输入并输出新函数的Python语法。使用闭包可以快速和简单地创建装饰器。例如,我们可以通过定义一个计时器装饰器来演示如何使用闭包来实现装饰器:

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()  # 记录函数开始时间
        result = func(*args, **kwargs)  # 执行函数
        end_time = time.time()  # 记录函数结束时间
        print(f'{func.__name__}函数运行时间为:{end_time - start_time:.2f} 秒')
        return result
    return wrapper  # 返回内嵌函数名

@timer_decorator
def test_func():
    time.sleep(2) 

test_func()

在上面的代码中,我们定义了一个计时器装饰器,它记录函数运行时间,并在输出结果时打印运行时间。然后,我们通过将 @timer_decorator 应用到 test_func 来在实际函数上启用计时器。

当你调用 test_func() 时,它会执行被 timer_decorator 装饰的 wrapper() 函数,记录开始时间、执行函数并记录结束时间,最后输出执行时间并返回函数结果。

这就是Python闭包的简单介绍。通过使用闭包,可以轻松地实现一个装饰器或工厂函数的高级应用场景。

相关文章
|
2月前
|
缓存 JavaScript 前端开发
|
9月前
|
JavaScript 前端开发
对闭包的理解以及使用
对闭包的理解以及使用
27 1
|
11月前
|
存储 缓存 前端开发
详解 Reat 中的闭包问题
JavaScript 中的闭包一定是最可怕的特性之一。 即使是无所不知的 ChatGPT 也会告诉你这一点。 它也可能是最隐秘的语言概念之一。 每次编写任何 React 代码时,我们都会用到它,大多数时候我们甚至没有意识到。 但最终还是无法摆脱它们:如果我们想编写复杂且高性能的 React 应用程序,我们就必须了解闭包。
85 0
详解 Reat 中的闭包问题
|
前端开发
闭包
前端面试
闭包的使用
闭包的使用
56 0
|
自然语言处理 JavaScript
你真的懂闭包么?
前言 本文主要总结一下 到目前为止对闭包的理解. 好几年之前学习闭包的时候模模糊糊,看了网上的一些帖子,理解为:函数内部可以使用函数外部的变量,后面看了你所不知道的JS,以为自己懂了,后面面试的时候又感觉自己不懂了,而今感觉自己真正懂了==,特此记录一下。
112 0
|
Web App开发 设计模式 前端开发
五、闭包
初学JavaScript时,我在闭包上,走了很多弯路。而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战。 闭包有多重要?如果你是初入前端的朋友,我没有办法直观的告诉你闭包在实际开发中的无处不在,但是我可以告诉你,前端面试,必问闭包。面试官们常常用对闭包的了解程度来判定面试者的基础水平,保守估计,10个前端面试者,至少5个都死在闭包上。
119 0
五、闭包
|
JavaScript 前端开发
Day11-闭包应用 - 立即执行函数IIFE
Day11-闭包应用 - 立即执行函数IIFE
91 0