With关键字的使用 | 手把手教你入门Python之七十八

简介: with语句实质上是⼀个上下⽂管理器,很多需要手动关闭的连接,比如说,文件连接,socket连接,数据库的连接都能使用with关键字来自动关闭连接。

上一篇:面向对象案例练习 | 手把手教你入门Python之七十七
下一篇:自定义异常 | 手把手教你入门Python之七十九

本文来自于千锋教育在阿里云开发者社区学习中心上线课程《Python入门2020最新大课》,主讲人姜伟。

With关键字的使用

对于系统资源如⽂件、数据库连接、socket ⽽⾔,应⽤程序打开这些资源并执⾏完业务逻辑之后,必须做的⼀件事就是要关闭(断开)该资源。

⽐如 Python 程序打开⼀个⽂件,往⽂件中写内容,写完之后,就要关闭该⽂件,否则会出现什么情况呢?极端情况下会出现 "Too many open files" 的错误,因为系统允许你打开的最⼤⽂件数量是有限的。

同样,对于数据库,如果连接数过多⽽没有及时关闭的话,就可能会出现 "Can not connect to MySQL server Too many connections",因为数据库连接是⼀种⾮常昂贵的资源,不可能⽆限制的被创建。

来看看如何正确关闭⼀个⽂件。
普通版:

def m1():
    f = open("output.txt", "w")
    f.write("python之禅")
    f.close()

这样写有⼀个潜在的问题,如果在调⽤ write 的过程中,出现了异常进⽽导致后续代码⽆法继续执⾏,close⽅法⽆法被正常调⽤,因此资源就会⼀直被该程序占⽤者释放。那么该如何改进代码呢?

进阶版:

def m2():
    f = open("output.txt", "w")
    try:
        f.write("python之禅")
    except IOError:
        print("oops error")
    finally:
        f.close()

改良版本的程序是对可能发⽣异常的代码处进⾏ try 捕获,使⽤ try/finally 语句,该语句表示如果在 try 代码块中程序出现了异常,后续代码就不再执⾏,⽽直接跳转到 except 代码块。⽽⽆论如何,finally 块的代码最终都会被执⾏。因此,只要把 close 放在 finally 代码中,⽂件就⼀定会关闭。

⾼级版:

def m3():
    with open("output.txt", "r") as f:
        f.write("Python之禅")  # 不需要再手动去关闭文件
try:
    with open('01-练习.py', 'r')as file:
        file.read() # 不需要再手动的关闭文件
except FileNotFoundError:
    print('文件未找到')

⼀种更加简洁、优雅的⽅式就是⽤ with 关键字。open ⽅法的返回值赋值给变量 f,当离开 with 代码块的时候,系统会⾃动调⽤ f.close() ⽅法, with 的作⽤和使⽤ try/finally 语句是⼀样的。

上下文管理器

with语句实质上是⼀个上下⽂管理器,很多需要手动关闭的连接,比如说,文件连接,socket连接,数据库的连接都能使用with关键字来自动关闭连接。
with语句后的对象都会有 __enter__()__exit__() ⽅法。
在进⼊到上下⽂时,会⾃动调⽤ __enter__() ⽅法,程序正常执⾏完成,或者出现异常中断的时候,都会调⽤ __exit__() ⽅法。

class MyContext(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def __enter__(self):
        print('调⽤了enter⽅法')
        return self
        
    def test(self):
        1 / 0
        print(self.name + '调⽤了test⽅法')
        
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('调⽤了exit⽅法')
        print(exc_type, exc_val, exc_tb)
        
with MyContext('zhangsan', 18) as context:
    context.test()
class Demo(object):
    def __init__(self):
        print('__enter__方法被执行了')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('__exit__方法被调用了')


def create_obj():
    x = Demo()
    return x

# y = create_obj()
# d = y.__enter__()


with create_obj() as d:  # as 变量名
    # 变量  d 不是 create_obj的返回结果
    # 它是创建的对象 y 调用 __enter__ 之后的返回结果
    print(d)

配套视频

相关文章
|
7天前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
65 1
|
24天前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
163 1
|
26天前
|
缓存 供应链 监控
1688item_search_factory - 按关键字搜索工厂数据接口深度分析及 Python 实现
item_search_factory接口专为B2B电商供应链优化设计,支持通过关键词精准检索工厂信息,涵盖资质、产能、地理位置等核心数据,助力企业高效开发货源、分析产业集群与评估供应商。
|
19天前
|
缓存 监控 算法
唯品会item_search - 按关键字搜索 VIP 商品接口深度分析及 Python 实现
唯品会item_search接口支持通过关键词、分类、价格等条件检索商品,广泛应用于电商数据分析、竞品监控与市场调研。结合Python可实现搜索、分析、可视化及数据导出,助力精准决策。
|
15天前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
Python API接口实战指南:从入门到精通
|
7天前
|
存储 Java 调度
Python定时任务实战:APScheduler从入门到精通
APScheduler是Python强大的定时任务框架,通过触发器、执行器、任务存储和调度器四大组件,灵活实现各类周期性任务。支持内存、数据库、Redis等持久化存储,适用于Web集成、数据抓取、邮件发送等场景,解决传统sleep循环的诸多缺陷,助力构建稳定可靠的自动化系统。(238字)
118 1
|
19天前
|
缓存 监控 算法
苏宁item_search - 按关键字搜索商品接口深度分析及 Python 实现
苏宁item_search接口支持通过关键词、分类、价格等条件检索商品,广泛应用于电商分析、竞品监控等场景。具备多维度筛选、分页获取、数据丰富等特性,结合Python可实现搜索、分析与可视化,助力市场研究与决策。
|
18天前
|
JSON 缓存 供应链
电子元件 item_search - 按关键字搜索商品接口深度分析及 Python 实现
本文深入解析电子元件item_search接口的设计逻辑与Python实现,涵盖参数化筛选、技术指标匹配、供应链属性过滤及替代型号推荐等核心功能,助力高效精准的电子元器件搜索与采购决策。
|
24天前
|
缓存 自然语言处理 算法
item_search - Lazada 按关键字搜索商品接口深度分析及 Python 实现
Lazada的item_search接口是关键词搜索商品的核心工具,支持多语言、多站点,可获取商品价格、销量、评分等数据,适用于市场调研与竞品分析。
|
存储 数据库 Python
Python - with 语句
Python - with 语句
172 0

推荐镜像

更多