news 2026/7/2 0:11:01

Python 中with语句详解和代码示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 中with语句详解和代码示例

Python 中的with语句是**上下文管理器(Context Manager)**最常见、最优雅的使用方式。它主要解决资源管理的问题(文件、网络连接、数据库连接、锁、临时目录等),能保证“无论是否发生异常,资源都会被正确释放”。

with 语句的核心价值(一句话总结)

替代传统的try-finally结构,让代码更简洁、更安全、更可读。

1. 最常见的用法 —— 文件操作

# 传统写法(容易忘记 close)f=open('data.txt','r',encoding='utf-8')try:content=f.read()print(content)finally:f.close()# 必须写在 finally 里# 使用 with(推荐)withopen('data.txt','r',encoding='utf-8')asf:content=f.read()print(content)# 这里可以随意写多行操作# with 语句块结束后,f 自动被关闭(即使中间抛异常也一样)print(f.closed)# True

2. with 同时打开多个资源(Python 3.1+)

withopen('input.txt')asfin,open('output.txt','w')asfout:forlineinfin:fout.write(line.upper())

Python 3.3+ 更推荐这种写法(括号可省略):

with(open('input.txt',encoding='utf-8')asfin,open('output.log','a',encoding='utf-8')aslog):log.write("开始处理\n")forlineinfin:log.write(f"处理:{line.strip()}\n")

3. 常见的内置上下文管理器

场景写法示例主要作用
文件with open(...) as f:自动关闭文件
线程锁with lock:自动获取/释放锁
decimal 精度控制with decimal.localcontext(prec=10):临时改变精度,退出后恢复
临时改变目录with tempfile.TemporaryDirectory() as tmp:用完自动删除临时目录
关闭连接with conn:(数据库连接对象)自动 commit / rollback + 关闭
抑制特定异常with contextlib.suppress(FileNotFoundError):忽略指定异常,不打印 traceback

4. 自己编写上下文管理器(两种主流方式)

方式一:基于类(最清晰、最常用)
classMyTimer:def__init__(self,name=""):self.name=namedef__enter__(self):importtime self.start=time.perf_counter()print(f"[{self.name}] 开始计时...")returnself# 可以返回 self 供 as 变量使用def__exit__(self,exc_type,exc_value,traceback):importtime elapsed=time.perf_counter()-self.startprint(f"[{self.name}] 结束,用时:{elapsed:.4f}秒")# 返回 True 表示“吞掉”异常;返回 False 或 None 则异常继续向外抛returnFalse# 使用withMyTimer("下载任务")ast:time.sleep(1.2)# 模拟一些工作
方式二:用 @contextmanager 装饰器(更简洁)
fromcontextlibimportcontextmanagerimporttime@contextmanagerdeftimer(name=""):start=time.perf_counter()print(f"[{name}] 开始...")try:yield# yield 之前的代码是 __enter__,之后的代码是 __exit__finally:elapsed=time.perf_counter()-startprint(f"[{name}] 结束,用时:{elapsed:.3f}s")# 使用方式和普通 with 完全一样withtimer("测试块"):time.sleep(0.8)print("正在干活...")

5. 常见面试/进阶问题点

问题答案要点
with 语句执行顺序是什么?1. 执行__enter__()
2. 执行 with 代码块
3. 执行__exit__()(无论是否异常)
__exit__返回 True 有什么效果?代表“异常已被处理”,外层不会再看到这个异常
可以用 with 写多层嵌套吗?可以,但建议用并列写法(Python 3.3+ 支持括号多上下文)
为什么数据库连接库都支持 with?因为实现了上下文管理协议,能自动管理事务和连接关闭
contextlib.ExitStack有什么用?当你需要在运行时动态决定要管理的资源数量时使用(高级用法)

6. 总结口诀

希望这些例子和说明能帮你彻底搞懂with语句~
有哪部分还想再深入看看吗?(比如 ExitStack、多线程锁、asyncio 中的 async with 等)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 16:06:18

考虑源荷两侧不确定性的含风电电力系统低碳调度Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

作者头像 李华
网站建设 2026/7/1 16:06:25

cv_unet_image-matting实战案例:社交媒体头像自动生成平台搭建步骤

cv_unet_image-matting实战案例:社交媒体头像自动生成平台搭建步骤 1. 项目背景与目标 你有没有遇到过这种情况:想换个社交平台头像,但手头的照片背景太乱,修图又麻烦?现在,借助AI图像抠图技术&#xff0…

作者头像 李华
网站建设 2026/7/1 8:44:15

YOLOE推理速度实测:比YOLO-Worldv2快1.4倍

YOLOE推理速度实测:比YOLO-Worldv2快1.4倍 在开放词汇目标检测领域,模型不仅要“看得懂”,更要“看得快”。尤其是在工业质检、自动驾驶、智能监控等实时性要求极高的场景中,推理速度直接决定了AI能否真正落地。最近推出的 YOLOE…

作者头像 李华
网站建设 2026/7/1 16:06:28

窄/宽/分段mask测试全覆盖!lama适应性强

窄/宽/分段mask测试全覆盖!lama适应性强 1. 引言:图像修复的痛点与突破 你有没有遇到过这样的情况:一张珍贵的照片里有个路人乱入,或者截图上的水印遮挡了关键信息?传统修图靠手动涂抹、复制粘贴,费时费力…

作者头像 李华