

Python入门:Python3 with关键字全面学习教程
Python入门:Python3 with关键字全面学习教程,本文详细介绍了 Python 中 with 关键字的相关知识。with 基于上下文管理协议,能优雅处理资源管理问题,解决了传统方式易遗漏释放资源、代码冗长、异常处理复杂等问题,具有自动释放资源、代码简洁等优势。文章阐述了其基本语法、工作原理,列举了文件操作、数据库连接等应用场景,还讲解了自定义上下文管理器的两种方式,以及常见问题与最佳实践,旨在帮助读者掌握 with 的使用与原理,写出更可靠的代码。

前言
Python作为一门简洁、易读、功能强大的编程语言,其基础语法是入门学习的核心。掌握好基础语法,能为后续的编程实践打下坚实的基础。本文将全面讲解Python3的基础语法知识,适合编程初学者系统学习。Python以其简洁优雅的语法和强大的通用性,成为当今最受欢迎的编程语言。本专栏旨在系统性地带你从零基础入门到精通Python核心。无论你是零基础小白还是希望进阶的专业开发者,都将通过清晰的讲解、丰富的实例和实战项目,逐步掌握语法基础、核心数据结构、函数与模块、面向对象编程、文件处理、主流库应用(如数据分析、Web开发、自动化)以及面向对象高级特性,最终具备独立开发能力和解决复杂问题的思维,高效应对数据分析、人工智能、Web应用、自动化脚本等广泛领域的实际需求。


🥇 点击进入Python入门专栏,Python凭借简洁易读的语法,是零基础学习编程的理想选择。本专栏专为初学者设计,系统讲解Python核心基础:变量、数据类型、流程控制、函数、文件操作及常用库入门。通过清晰示例与实用小项目,助你快速掌握编程思维,打下坚实根基,迈出自动化办公、数据分析或Web开发的第一步。
🥇 点击进入Python小游戏实战专栏, 寓教于乐,用Python亲手打造经典小游戏!本专栏通过开发贪吃蛇、飞机大战、猜数字、简易版俄罗斯方块等趣味项目,在实践中掌握Python核心语法、面向对象编程、事件处理、图形界面(如Pygame)等关键技能,将枯燥的代码学习转化为可见的成果,让学习编程充满乐趣与成就感,快速提升实战能力。
🥇 点击进入Python小工具实战专栏,告别重复劳动,用Python打造效率神器!本专栏教你开发文件批量处理、自动邮件通知、简易爬虫、桌面提醒、密码生成器、天气查询等实用小工具。聚焦os、shutil、requests、smtplib、schedule等核心库,通过真实场景案例,快速掌握自动化脚本编写技巧,解放双手,显著提升工作与生活效率,让代码真正服务于你的日常。
🥇 点击进入Python爬虫实战专栏,解锁网络数据宝库!本专栏手把手教你使用Python核心库(如requests、BeautifulSoup、Scrapy)构建高效爬虫。从基础网页解析到动态页面抓取、数据存储(CSV/数据库)、反爬策略应对及IP代理使用,通过实战项目(如电商比价、新闻聚合、图片采集、舆情监控),掌握合法合规获取并利用网络数据的核心技能,让数据成为你的超能力。
🥇 点击进入Python项目实战专栏,告别碎片化学习,挑战真实项目!本专栏精选Web应用开发(Flask/Django)、数据分析可视化、自动化办公系统、简易爬虫框架、API接口开发等综合项目。通过需求分析、架构设计、编码实现、测试部署的全流程,深入掌握工程化开发、代码复用、调试排错与团队协作核心能力,积累高质量作品集,真正具备解决复杂问题的Python实战经验。

🌐 前篇文章咱们讲解了 Python入门:Python3 迭代器与生成器全面学习教程 ,如果忘记了,可以去重温一下,不停的重复敲击基础代码,有助于让你更加熟练掌握一门语言。今天咱们学习 Python3 with关键字全面学习教程,下面开始吧!
在 Python 编程中,资源管理(如文件操作、数据库连接等)是一个绕不开的重要环节。如果处理不当,很容易出现资源泄露、程序异常等问题。而 with 关键字作为 Python 上下文管理协议的核心,为我们提供了一种简洁、安全且优雅的资源管理方式。本文将从基础到进阶,全面讲解 with 关键字的使用方法、工作原理及实际应用场景。
一、为什么需要 with 语句?
在了解 with 语句之前,我们先看看传统的资源管理方式存在哪些问题。以文件操作为例,传统写法通常是这样的:
file = open('example.txt', 'r')
try:
content = file.read()
# 处理文件内容
finally:
file.close()
这种写法看似严谨,但存在三个明显问题:
- 容易遗漏资源释放:如果忘记写
finally块或close()方法,文件资源可能无法正常释放,尤其在程序异常时风险更高。 - 代码冗长:简单的文件读取需要嵌套
try-finally块,增加了代码的冗余度。 - 异常处理复杂:若要处理文件操作中可能出现的异常,还需额外添加
except块,进一步增加代码复杂度。
而 with 语句正是为解决这些问题而生的。
二、with 语句的优势
with 语句基于 Python 的上下文管理协议(Context Management Protocol),相比传统方式,它具有以下优势:
- 自动资源释放:无论代码块是否正常执行或发生异常,资源都会被自动释放(如文件自动关闭、数据库连接自动断开)。
- 代码简洁:省去了手动编写
try-finally块的冗余代码,让核心逻辑更突出。 - 异常安全:即使代码块中发生异常,资源清理操作也能保证执行。
- 可读性强:通过
with语句可以清晰标识资源的作用域,让代码逻辑更易理解。
三、with 语句的基本语法
1. 基础语法格式
with 语句的基本形式如下:
with expression [as variable]:
# 代码块(使用资源的逻辑)
expression:返回一个支持上下文管理协议的对象(如open()函数返回的文件对象)。as variable(可选):将expression的结果赋值给变量,方便在代码块中使用资源。- 代码块执行完毕后,会自动调用资源的清理方法(如文件的
close())。
2. 文件操作示例
最常见的 with 语句应用就是文件操作,例如读取文件:
with open('example.txt', 'r',encoding='utf-8') as file:
content = file.read()
print(content)
# 代码块结束后,文件已自动关闭,无需手动调用 close()


这段代码与前面的 try-finally 实现完全等价,但更加简洁明了。
四、with 语句的工作原理
with 语句的强大之处源于 Python 的上下文管理协议,该协议要求对象必须实现两个特殊方法:
1. 上下文管理协议的核心方法
__enter__():进入上下文时调用,返回值会赋值给as后的变量(若指定)。__exit__():退出上下文时调用(无论代码块是否正常执行),负责资源清理工作(如关闭文件、释放连接)。
2. 执行流程
with 语句的完整执行流程如下:
- 执行
expression,获取一个上下文管理器对象(实现了__enter__和__exit__方法)。 - 调用对象的
__enter__()方法,将返回值赋给as后的变量(若有)。 - 执行
with语句块中的代码(核心业务逻辑)。 - 无论代码块是否发生异常,都会调用对象的
__exit__()方法进行资源清理。
3. 异常处理机制
__exit__() 方法可以接收三个参数,用于处理代码块中可能出现的异常:
exc_type:异常类型(若未发生异常,则为None)。exc_val:异常值(若未发生异常,则为None)。exc_tb:异常追踪信息(若未发生异常,则为None)。
__exit__() 的返回值决定了异常是否继续传播:
- 返回
True:表示异常已被处理,不会向外传播。 - 返回
False或None:异常会继续向外传播(默认行为)。
五、实际应用场景
with 语句不仅限于文件操作,在许多需要资源管理的场景中都能发挥作用。
1. 同时操作多个文件
with 语句支持同时管理多个资源,只需用逗号分隔:
# 读取 input.txt 内容,写入 output.txt(转换为大写)
with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile:
content = infile.read()
outfile.write(content.upper())



执行后,两个文件会被自动关闭,无需分别处理。
2. 数据库连接管理
操作数据库时,连接的释放至关重要。使用 with 语句可以自动管理连接:
import sqlite3
# 连接数据库并执行查询,结束后自动关闭连接
with sqlite3.connect('database.db') as conn:
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
results = cursor.fetchall()
3. 线程锁管理
在多线程编程中,使用 with 语句管理线程锁可以确保临界区代码的线程安全:
import threading
lock = threading.Lock()
with lock:
# 临界区代码(同一时间只有一个线程执行)
print("这段代码是线程安全的")
代码块执行完毕后,锁会自动释放,避免死锁风险。
4. 临时修改系统状态
某些场景下需要临时修改系统配置(如精度、编码等),with 语句可确保修改后自动恢复:
import decimal
# 临时设置高精度计算
with decimal.localcontext() as ctx:
ctx.prec = 42 # 精度设为42位
result = decimal.Decimal(1) / decimal.Decimal(3)
print(result) # 输出高精度结果
# 退出上下文后,精度恢复默认值
六、创建自定义的上下文管理器
除了 Python 内置的上下文管理器(如文件对象、数据库连接),我们还可以自定义符合需求的上下文管理器。
1. 类实现方式
通过定义一个类并实现 __enter__ 和 __exit__ 方法,即可创建自定义上下文管理器。例如,实现一个简单的计时器:
class Timer:
def __enter__(self):
import time
self.start = time.time() # 记录开始时间
return self # 返回实例给 as 后的变量
def __exit__(self, exc_type, exc_val, exc_tb):
import time
self.end = time.time() # 记录结束时间
print(f"耗时: {self.end - self.start:.2f}秒") # 计算并打印耗时
return False # 不处理异常,让异常继续传播
# 使用自定义计时器
with Timer() as t:
# 执行耗时操作(示例:计算100万以内整数的和)
sum(range(1000000))
执行结果:
耗时: 0.05秒
2. 使用 contextlib 模块
Python 的 contextlib 模块提供了更简洁的方式创建上下文管理器,通过装饰器 @contextmanager 即可将普通函数转换为上下文管理器:
from contextlib import contextmanager
@contextmanager
def tag(name):
print(f"<{name}>") # __enter__ 阶段执行
yield # 暂停,执行 with 代码块
print(f"</{name}>") # __exit__ 阶段执行
# 使用示例:模拟 HTML 标签包裹内容
with tag("h1"):
print("这是一个标题")
执行结果:
<h1>
这是一个标题
</h1>
yield 之前的代码相当于 __enter__ 方法,yield 之后的代码相当于 __exit__ 方法。
七、常见问题与最佳实践
常见错误
-
误以为
with只用于文件:实际上,with可用于任何实现上下文管理协议的对象(如数据库连接、线程锁等)。错误示例:
# 错误:未用 with 管理数据库连接 conn = sqlite3.connect('db.sqlite')正确示例:
# 正确:用 with 自动管理连接 with sqlite3.connect('db.sqlite') as conn: pass -
忽略
__exit__的返回值:若需在自定义上下文管理器中处理异常,__exit__需返回True,否则异常会继续传播。
最佳实践
- 优先用
with管理资源:对于文件、网络连接、锁等资源,with是最安全的管理方式。 - 保持上下文简洁:
with块中应只包含与资源相关的操作,避免冗余逻辑。 - 合理处理异常:根据需求决定是否在
__exit__中处理异常,避免掩盖问题。 - 利用多上下文管理:单个
with语句可同时管理多个资源(如同时读写两个文件)。
总结
with 语句是 Python 中处理资源管理的优雅方案,其核心是通过上下文管理协议实现资源的自动释放。无论是内置的文件操作、数据库连接,还是自定义的上下文管理器,with 都能显著简化代码并提高程序的健壮性。
掌握 with 语句的使用和原理,能帮助你写出更简洁、更可靠的 Python 代码。希望本文对你理解 with 关键字有所帮助,快去实践中尝试吧!
💡下一篇咱们学习 Python3 函数全面学习教程!
附录:扩展学习资源
- 官方资源:
- Python官网:https://www.python.org
- PyPI:https://pypi.org(查找第三方库)
- 安装包等相关文件(另附带pycharm工具),网盘下载地址:https://pan.quark.cn/s/649af731037c
- 学习资料视频和文档资源,网盘下载地址: https://pan.quark.cn/s/ee16901a8954
- 本专栏特色资源:
- 代码资源仓库:CSDN专属资源在线获取
- 海量Python教程:关注公众号:xcLeigh,获取网盘地址
- 一对一答疑:添加微信与博主在线沟通(
备注“Python专栏”)
联系博主
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🏰 大屏可视化 🌀 带你体验酷炫大屏!
💯 神秘个人简介 🌀 带你体验不一样得介绍!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!
💦 注:本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。

📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌
1372





