当前位置: 首页 > news >正文

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

在 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.hskmm.com/?act=detail&tid=22176

相关文章:

  • input() 函数
  • 如何确保CMS系统能够飞快响应用户请求?全面性能优化指南
  • 近期
  • Playwright MCP 的使用与调试技巧
  • 实用指南:零基础学AI大模型之LangChain-PromptTemplate
  • 文件上传攻击全面指南:从侦察到防御
  • 2025年陕西洋房楼盘,西安城西品质楼盘,沣东品牌楼盘住宅口碑推荐,地建嘉信臻境户型多元布局,满足全周期生活需求
  • asus nuc15 pro ultra7 255H 外接 fevm 雷电5显卡坞 BIOS设置
  • P11529 [THUPC 2025 初赛] 辞甲猾扎
  • 2025年陕西品牌楼盘,西安城西优质楼盘,西咸新区核心楼盘住宅口碑推荐,地建嘉信臻境距吾悦广场一路之隔,商业配套完善
  • ARC113E Rvom and Rsrev
  • 2025年西咸新区高端楼盘,西安刚需楼盘,沣东改善楼盘住宅口碑推荐,地建嘉信臻境3分钟通达高新,区位优势明显
  • P12704 Retribution
  • Sunny Pro 网络验证- 仅需一键,即可为您的exe添加高强度防破加密!
  • 一条mysql数据库更新语句
  • 浅谈递归入门(1) - 指南
  • python+uniapp基于微信小工具的医院陪诊预约系统
  • [深度学习] 大模型学习5-高效微调框架Unsloth使用指北
  • 【APK安全】组件安全核心风险与防御指南 - 详解
  • 前端-JavaScript简介JavaScript模块化 - 努力-
  • 基本地址变换机构
  • 2025工业网线厂家权威推荐榜:千兆/拖链/高柔/网线/六类/超五类/6类/超5类/千兆/超六类/8芯/4芯/成品/相机/视觉数据工业网线高强屏蔽与稳定传输实力之选
  • gitee 使用安装教程
  • VisualMimic——基于视觉的人形行走-操作控制:低层策略负责平衡控制且跟踪高层下发的指令、高层策略则基于自我中心视觉输入生成任务跟踪指令 - 实践
  • 基本分页存储管理的基本概念
  • luogu P6503 [COCI 2010/2011 #3] DIFERENCIJA
  • 详细介绍:自动化接口框架搭建分享-pytest第三部分
  • Solon Plugin 自动装配机制详解
  • 2025宅基地纠纷律所权威推荐榜:专业调解与胜诉保障实力之选
  • 2025上海骨灰盒哪里买优质厂家权威推荐榜:匠心工艺与品质服务之选