Python 闭包的应用场景与实战案例

news/2025/10/1 12:38:57/文章来源:https://www.cnblogs.com/soda-nav/p/19122349

在 Python 中,闭包是一种非常强大的功能,它允许我们创建私有的作用域,并在函数外部访问函数内部的变量。闭包在实际开发中有着广泛的应用,从简单的数据隐藏到复杂的装饰器实现,闭包都能大显身手。今天,就让我们一起深入学习 Python 中的闭包,掌握其应用场景和实战案例。

一、闭包的基本概念

(一)什么是闭包?

闭包是一个函数对象,它记录了一些在其定义上下文中的变量。闭包可以访问其定义时的作用域中的变量,即使这些变量在其定义的函数已经执行完毕后仍然存在。

(二)闭包的构成

闭包由以下三个部分构成:

  1. 外部函数:定义了闭包的函数。
  2. 内部函数:闭包本身,可以访问外部函数的变量。
  3. 自由变量:在内部函数中使用的,但不是内部函数参数的变量。

(三)示例代码

def outer_function(x):def inner_function(y):return x + yreturn inner_functionclosure = outer_function(10)
print(closure(5))  # 输出 15

二、闭包的应用场景

(一)数据隐藏

闭包可以用来隐藏数据,创建私有的变量,防止外部直接访问。

示例代码

def make_counter():count = 0def counter():nonlocal countcount += 1return countreturn countercounter1 = make_counter()
print(counter1())  # 输出 1
print(counter1())  # 输出 2counter2 = make_counter()
print(counter2())  # 输出 1
print(counter1())  # 输出 3

(二)函数工厂

闭包可以用来创建函数工厂,根据不同的参数生成不同的函数。

示例代码

def make_multiplier(factor):def multiplier(x):return x * factorreturn multiplierdouble = make_multiplier(2)
triple = make_multiplier(3)print(double(5))  # 输出 10
print(triple(5))  # 输出 15

(三)装饰器

装饰器本质上是闭包,用于在不修改原函数代码的情况下,增加函数的功能。

示例代码

def my_decorator(func):def wrapper(*args, **kwargs):print("Something is happening before the function is called.")result = func(*args, **kwargs)print("Something is happening after the function is called.")return resultreturn wrapper@my_decorator
def say_hello(name):print(f"Hello, {name}!")say_hello("Alice")

(四)延迟计算

闭包可以用来实现延迟计算,即在需要时才计算某个值。

示例代码

def delay_function():def delayed():print("This function is called later.")return delayeddelayed_function = delay_function()
delayed_function()  # 输出 "This function is called later."

(五)状态保持

闭包可以用来保持状态,即使在函数调用结束后,状态仍然存在。OpenSpeedy

示例代码

def create_counter():count = 0def counter():nonlocal countcount += 1return countreturn countercounter = create_counter()
print(counter())  # 输出 1
print(counter())  # 输出 2

三、实战案例

(一)实现一个简单的缓存装饰器

缓存装饰器可以用来缓存函数的计算结果,提高程序的性能。Uchinoko

示例代码

def cache_decorator(func):cache = {}def wrapper(*args):if args in cache:return cache[args]result = func(*args)cache[args] = resultreturn resultreturn wrapper@cache_decorator
def compute(x):print(f"Computing {x}...")return x * xprint(compute(2))  # 输出 "Computing 2..." 和 4
print(compute(2))  # 直接返回 4
print(compute(3))  # 输出 "Computing 3..." 和 9

(二)实现一个简单的计数器装饰器

计数器装饰器可以用来统计函数被调用的次数。AirConsole

示例代码

def count_decorator(func):count = 0def wrapper(*args, **kwargs):nonlocal countcount += 1print(f"Function {func.__name__} has been called {count} times.")return func(*args, **kwargs)return wrapper@count_decorator
def say_hello(name):print(f"Hello, {name}!")say_hello("Alice")
say_hello("Bob")

(三)待办事项列表(Todo List)

使用闭包管理待办事项的添加、删除和展示。Convertio

示例代码

def todo_manager():tasks = []def add_task(task):tasks.append(task)return f"任务 '{task}' 已添加。"def remove_task(task):if task in tasks:tasks.remove(task)return f"任务 '{task}' 已移除。"else:return f"任务 '{task}' 不存在。"def show_tasks():return "当前任务列表:" + ", ".join(tasks) if tasks else "无任务。"return add_task, remove_task, show_tasks# 测试案例
add, remove, show = todo_manager()
print(add("写报告"))      # 输出: 任务 '写报告' 已添加。
print(add("开会"))       # 输出: 任务 '开会' 已添加。
print(show())            # 输出: 当前任务列表:写报告, 开会
print(remove("开会"))    # 输出: 任务 '开会' 已移除。
print(show())            # 输出: 当前任务列表:写报告

四、总结

通过本文的介绍,你已经全面掌握了 Python 中的闭包,从基本概念到应用场景和实战案例。以下是关键点总结:

  • 闭包的定义:闭包是一个函数对象,它记录了一些在其定义上下文中的变量。
  • 闭包的构成:外部函数、内部函数、自由变量。
  • 应用场景:数据隐藏、函数工厂、装饰器、延迟计算、状态保持。
  • 实战案例:实现缓存装饰器、计数器装饰器、待办事项列表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 智能垃圾桶项目笔记(二):超声波测距功能实现 - 指南

STM32 智能垃圾桶项目笔记(二):超声波测距功能实现 - 指南2025-10-01 12:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !import…

做电影网站要几G空间的网站开发商业秘密保密协议

Part 1 制图综述 1.1 制图的目的 随着GIS在各行各业的深入应用,各信息化部门和生产单位都逐渐建立起自己的GIS的应用,同时积累了大量的地理数据。随着应用深度和广度的推进,针对数据建立专题应用越来越迫切,对行业专题制图的需…

通过配置 GitLab 自动触发项目自动化构建与部署 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

双网卡服务器校园网访问故障排查与解决​ - 教程

双网卡服务器校园网访问故障排查与解决​ - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

黄页网站建设建筑公司网站封面图片

1、下载vscode 官网地址:https://code.visualstudio.com/ 针对ubuntu点击下载deb安装包,默认下载地址如下,下载速度很慢,而且会下载失败,解决方法如下: 将“https://az764295.vo.msecnd.net”改为“https://vscode.cdn.azure.cn”后,下载会很快。 例如,将: https:…

怎么实现网站建设报价方案手机免费在线搭建网站

一页有三栏:主栏、副栏、思考栏。主栏主要是在右上角,主要记录学到的内容。副栏在左边,主要是简单概括重点。思考栏在底部,主要是记录收获、感悟。 主栏:在听讲或阅读时把重要的内容或知识的要点记录在右侧的区域&…

详述网站建设的过程简答题二次元网站开发的意义

SPI相关基础知识 SPI基本概念请自行百度,参考:百度百科SPI简介.我们讲重点和要注意的地方。 master模式下要关注的地方 接线一一对应 也就是说主控的MISO,MOSI,SCLK,[CSn]分别和设备的MISO,MOSI,SCLK,[CSn]一一对应相连,不交叉&#xff0…

US$9.99 Cheap Galletto 1260 ECU Chip Tuning Interface EOBD Tuning Tools

Galletto 1260 ECU Chip Tuning Interface With Multi LanguagesTop 4 Reasons to Get Galletto 12601. Supported Languages: English, Spanish, French, German, Italian, Portuguese2. EOBD2 Flasher 1260 is an ea…

万网主机怎么上传网站吗网站建设的简历制作

在我之前的文章 “Elasticsearch:对 Java 对象的 ES|QL 查询”,我详细介绍了如何使用 Java 来对 ES|QL 进行查询。对于不是很熟悉 Elasticsearch 的开发者来说,那篇文章里的例子还是不能单独来进行运行。在今天的这篇文章中,我来详…

房产网站模板程序在线oa

内容摘要 我国推动的工业互联网是更加广义的工业互联网,不仅包括设备的联网。其核心是提升我国工业能力和工业水平,是我国制造业转型升级的重要推手和抓手。我们把工业互联网分为六个层级,包括设备层、网络层、平台层、软件层、应用层和安全…

US$9 TF Card 4GB Flash Memory Card Can Work on Ksuite

TF Card 4GB Flash Memory Card Can Work on KsuitePackage List:1pc x 4GB TF Card Pictures of TF Card 4GB Flash Memory Card Can Work on KsuiteTF Card 4GB Flash Memory Card Can Work on Ksuite, now only nee…

详细介绍:MySQL备份策略核心知识点总结

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

新手学网站建设视频教程共30课高清版2狠狠做网站

题目 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 …

input() 函数

格式: 变量 = input("提示信息:")用户输入的任何内容,都将被 Python 识别为字符串。

Playwright MCP 的使用与调试技巧

摘要 本文将详细介绍 Playwright MCP 的使用方法、常见问题及解决方案,特别针对中国开发者,尤其是 AI 应用开发者。文章通过实践案例、代码示例、架构图、流程图等多种形式,帮助读者快速掌握 Playwright MCP 的核心…

什么网站建设效果好泰安最新通告今天

文章目录 一.基本介绍二.性能指标三.下载安装JMeter1.下载安装包2.启动JMeter 四.使用JMeter1.模拟用户请求2.填写测试地址3.接收测试结果4.结果解释 一.基本介绍 压力测试考察当前软硬件条件下系统所能承受的最大负荷并找到系统瓶颈所在。压测是为了系统在线上的处理能力和稳定…

网站运行速度慢中铁建设集团有限公司官方网站

摘要 本文使用2024年最新的ELA注意力机制改进YoloV8的Neck层,实现涨点!改进方式简单易用,涨点明显!欢迎大家使用。 大家在订阅专栏后,记着加QQ群啊!有些改进方法确实有难度,大家在改进的过程中遇到问题,我会解答和指导! 论文:《ELA:深度卷积神经网络的高效局部注意…

公司网站开发的工作内容链接买卖价格

php fgets()函数从文件指针读取一行语法:fgets(file,length)参数说明必需的. 指定姚要读取的文件长度可选. 指定姚都区的字节数. 默认值为102字节从文件所指向的文件中读取一行,并返回最大长度为1个字节的字符串. 遇到换行符(包含在返回值中,)&#xff0…

自适应网站教程wordpress ie兼容

🏡《总目录》 目录 1,概述2,工作原理2.1,材料特性2.2,温度升高2.3,温度降低2.4,数学模型3,结构特点3.1,磁芯3.2,线圈3.3,骨架3.4,绝缘材料4,工艺流程4.1,材料准