闭包(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闭包的简单介绍。通过使用闭包,可以轻松地实现一个装饰器或工厂函数的高级应用场景。

相关文章
|
测试技术 Python
Appium自动化框架从0到1之 执行测试用例& 生成测试报告&发送邮件
Appium自动化框架从0到1之 执行测试用例& 生成测试报告&发送邮件
375 1
|
前端开发
css的渐变属性linear-gradient
css的渐变属性linear-gradient
|
11月前
|
存储 Java API
java 时区时间转为UTC
通过以上方法和代码示例,你可以轻松地在Java中将特定时区的时间转换为UTC时间。确保理解每一步的实现细节,应用到实际项目中时能有效地处理时区转换问题。
555 18
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
2903 17
Spring Boot 两种部署到服务器的方式
|
PHP
[SWPUCTF 2021 新生赛]include
[SWPUCTF 2021 新生赛]include
544 0
|
缓存 Linux 编译器
Linux系统中u-boot启动流程分析(详解)
Linux系统中u-boot启动流程分析(详解)
1692 2
|
机器学习/深度学习 算法
【PAT甲级】1003 Emergency
【PAT甲级】1003 Emergency
149 0
|
Java 应用服务中间件 Maven
springboot整合websocket后启动报错:javax.websocket.server.ServerContainer not available
springboot整合websocket后启动报错:javax.websocket.server.ServerContainer not available
5851 1
|
编解码 安全 NoSQL
vulnhub_IMF缓冲区溢出详解
vulnhub_IMF缓冲区溢出详解
248 0
vulnhub_IMF缓冲区溢出详解
|
图形学
【3D建模制作技巧分享】如何使用Maya制作绳索模型
Maya是很多建模师、动画师都使用的软件,它可以帮助我们制作出很多模型。下面为大家分享使用Maya制作绳索模型的方法,感兴趣的话就来看看吧!
507 0
【3D建模制作技巧分享】如何使用Maya制作绳索模型

热门文章

最新文章