Python入门:Python3 with关键字全面学习教程

该文章已生成可运行项目,

在这里插入图片描述

在这里插入图片描述

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实战经验。


Python3 with关键字全面学习教程


🌐 前篇文章咱们讲解了 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 语句的完整执行流程如下:

  1. 执行 expression,获取一个上下文管理器对象(实现了 __enter____exit__ 方法)。
  2. 调用对象的 __enter__() 方法,将返回值赋给 as 后的变量(若有)。
  3. 执行 with 语句块中的代码(核心业务逻辑)。
  4. 无论代码块是否发生异常,都会调用对象的 __exit__() 方法进行资源清理。

3. 异常处理机制

__exit__() 方法可以接收三个参数,用于处理代码块中可能出现的异常:

  • exc_type:异常类型(若未发生异常,则为 None)。
  • exc_val:异常值(若未发生异常,则为 None)。
  • exc_tb:异常追踪信息(若未发生异常,则为 None)。

__exit__() 的返回值决定了异常是否继续传播:

  • 返回 True:表示异常已被处理,不会向外传播。
  • 返回 FalseNone:异常会继续向外传播(默认行为)。

五、实际应用场景

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())
input.txt文件

在这里插入图片描述

控制台输出

在这里插入图片描述

生成的output.txt文件

在这里插入图片描述

执行后,两个文件会被自动关闭,无需分别处理。

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__ 方法。

七、常见问题与最佳实践

常见错误

  1. 误以为 with 只用于文件:实际上,with 可用于任何实现上下文管理协议的对象(如数据库连接、线程锁等)。

    错误示例:

    # 错误:未用 with 管理数据库连接
    conn = sqlite3.connect('db.sqlite')
    

    正确示例:

    # 正确:用 with 自动管理连接
    with sqlite3.connect('db.sqlite') as conn:
        pass
    
  2. 忽略 __exit__ 的返回值:若需在自定义上下文管理器中处理异常,__exit__ 需返回 True,否则异常会继续传播。

最佳实践

  1. 优先用 with 管理资源:对于文件、网络连接、锁等资源,with 是最安全的管理方式。
  2. 保持上下文简洁with 块中应只包含与资源相关的操作,避免冗余逻辑。
  3. 合理处理异常:根据需求决定是否在 __exit__ 中处理异常,避免掩盖问题。
  4. 利用多上下文管理:单个 with 语句可同时管理多个资源(如同时读写两个文件)。

总结

with 语句是 Python 中处理资源管理的优雅方案,其核心是通过上下文管理协议实现资源的自动释放。无论是内置的文件操作、数据库连接,还是自定义的上下文管理器,with 都能显著简化代码并提高程序的健壮性。

掌握 with 语句的使用和原理,能帮助你写出更简洁、更可靠的 Python 代码。希望本文对你理解 with 关键字有所帮助,快去实践中尝试吧!

💡下一篇咱们学习 Python3 函数全面学习教程!

附录:扩展学习资源

  1. 官方资源
  2. 本专栏特色资源
    • 代码资源仓库:CSDN专属资源在线获取
    • 海量Python教程:关注公众号:xcLeigh,获取网盘地址
    • 一对一答疑:添加微信与博主在线沟通(备注“Python专栏”

联系博主

    xcLeigh 博主全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。

    亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

     愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

    至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


     💞 关注博主 🌀 带你实现畅游前后端!

     🏰 大屏可视化 🌀 带你体验酷炫大屏!

     💯 神秘个人简介 🌀 带你体验不一样得介绍!

     🥇 从零到一学习Python 🌀 带你玩转Python技术流!

     🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!

     💦 :本文撰写于CSDN平台,作者:xcLeigh所有权归作者所有)https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


在这里插入图片描述

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

本文章已经生成可运行项目
评论 158
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xcLeigh

万水千山总是情,打赏两块行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值