Python基础教程: with语句详解
with语句的应用场景
编程中有很多操作都是配套使用的,这种配套的流程可以称为计算过程,Python语言为这种计算过程专门设计了一种结构:with语句。比如文件处理就是这类计算过程的典型代表。
使用with语句前后对比
没有使用with语句之前,我们是这样打开一个文件的:
try:# 1. [进入]f = open('a.txt', 'r', encoding="utf-8")# 2. [执行]print(f.read())
finally:if f:# 3. [退出]f.close()
python操作文件的流程一般就是这三步:
- [进入]用只读方式打开文件
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在 - [执行]读取文件内容
如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示 - [退出]关闭打开的文件
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
思考为什么关闭文件操作一定要放在finallly语句里?
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现。
发现共性:
我们发现其实这种过程化的语句有共性,比如说在进去一个片段前必须做某种超赞,处理工作后又需要执行一个结束操作。比如上面的这段代码:
finally:if f:f.close()
上面的代码块就可以做一个封装。
使用with语句后,我们是这样打开一个文件的:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
with open("a.txt", "r", encoding="utf-8") as f:print(f.read())
这个with语句和前面的try … finally结构是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
with语句的执行原理
从解释器的角度去理解with语句执行流程。
with语句的基本形式是:
with 表达式 as 变量:语句块
这样的一段代码可以称为一个上下文(context),在执行with语句时,解释器会先求出表达式的值,这个值(对象)是一个上下文管理器,并且假设这个对象拥有如下两个类魔术方法:
def __enter__():# 描述进入上下文的动作passdef __exit__():# 描述退出上下文的动作pass
with语句在求出这个上下文管理器对象之后,自动执行进入方法,并将这个对象的返回值赋值于 as 之后的变量,然后执行语句块。然后在退出上下文前,自动执行对象的退出方法。
python系统和标准库的一些类型定义了这对操作,可以直接用于with语句。比如文件对象就直接支持这一对操作,因此可以用在with语句的头部。
如果你也有类似的计算过程需要抽取出来,那么可以自定义一个类,并且包含进入、退出方法。
自定义open函数
自己实现才发现,使用装饰器和生成器就能很好的解决这个问题,不需要用到类魔术方法来实现;
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import contextlib # 引入上下文管理包@contextlib.contextmanager # 给函数引入装饰器
def myopen(dir, mode):print("开始")f = open(dir, mode, encoding='utf-8')try: # 上文yield ffinally: # 下文print("结束")f.close()with myopen("a.txt", 'r') as fobj: # 把try中的yield中的f赋值给fobj# with会将with后面的函数中的yield赋值给fobjfor i in fobj:print(i)# 等待上面的循环结束后,才最终执行finally的代码,所以这就是上下文管理
输出:
开始
hello,我是a.txt的第1行文字。
结束
总结
打开文件读写、用pickle包完成数据的存储、恢复的操作,都非常适合使用with语句。
pickle包的使用案例:
try:with open("phone.pickle", "wb") as outf:pickle.dump("13193388105", outf)
except:print("file have errow.")try:with open("phone.pickle", "rb") as outf:data = pickle.load(outf)print(type(data))print(data)
except:print("file have errow.")
我总结了一下使用with语句的优点:
采用with语句的代码更简洁;
防止因为忘记写f.close()而引发的错误;
一个对象(上下文)的操作有进入、退出过程就可以抽取出来,并做成自动化执行;
Python基础教程: with语句详解相关推荐
- Python基础教程:括号()[]{}详解
Python主要有三种数据类型:字典.列表.元组.其分别由花括号,中括号,小括号表示. 如: 字典:dic={'a':12,'b':34} 列表:list=[1,2,3,4] 元组:tup=(1,2, ...
- python语言入门详解-python初级教程:入门详解
python初级教程:入门详解 Crifan Li 目录 前言 .................................................................... ...
- 【Python基础】reduce函数详解
转载请注明出处:[Python基础]reduce函数详解 reduce函数原本在python2中也是个内置函数,不过在python3中被移到functools模块中. reduce函数先从列表(或序列 ...
- keyshot渲染图文教程_KeyShot渲染教程,KeyShot渲染基础教程步骤图文详解
KeyShot渲染教程,KeyShot渲染基础教程步骤图文详解 KeyShot渲染教程,在我们导入了项目之后,接着我们就要输出图片或者动画了.这里有许多动态的方式来完成,在开始渲染之前,我们来设置我们 ...
- Spring Boot 2.x基础教程:配置文件详解
在快速入门一节中,我们轻松的实现了一个简单的RESTful API应用,体验了一下Spring Boot给我们带来的诸多优点,我们用非常少的代码量就成功的实现了一个Web应用,这是传统的Spring应 ...
- python初级教程:入门详解
本文是针对Python的初学者,从无到有的介绍Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行P ...
- Python基础语法day02字符串详解和列表
今天是python基础语法入门第二天,大概总共会有四天左右.四天后就是对于python的numpy库的详细文章.那话不多说,我们开始. 目录 字符串详解 字符串独有功能 检测头尾字符 判断输入结果是否 ...
- python条件语句-Python if else条件语句详解
前面我们看到的代码都是顺序执行的,也就是先执行第1条语句,然后是第2条.第3条--一直到最后一条语句,这称为顺序结构. 但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用, ...
- java多线程教程_java 基础教程之多线程详解及简单实例
java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它 ...
- vb net excel 剪贴板 粘贴_Excel零基础教程选项卡功能详解
Excel功能区详解 你了解[开始]选项卡吗? Excel的[开始]选项卡 应该是我们使用最多的选项卡了 开始中包含了粘贴板.格式刷. 填充桶.条件格式.序列等等实用功能 今天我们就从开始选项卡开始 ...
最新文章
- Android开发--Json数据的解析
- linux内核如何安装vim,如何在Linux 中安装和使用 PacVim?
- ArcGIS在线资源集
- 给选择模型的子模型添加COL
- php中数字可以加字符吗,在php中,怎么样把数字转化为字符串
- java都要caps标点_第 1 章 管理 Java CAPS 用户
- java bean spring_JavaBean和Spring bean傻傻分不清楚
- 你今天volatile了吗?--慎重使用
- 创业者需要知道的50句话
- 力扣—— 79/212. 单词搜索
- 快手大数据架构演进实录
- 软件测试工程师怎么样面试上好的公司?
- Python生态工具、文本处理和系统管理(虚拟)
- 公司居然使用监听设备,大家来讨论下IT公司应该怎样管理
- 2014年个人工作愿景
- sql查看mysql表结构_MySQL 查看表结构简单命令
- 最受欢迎的八种编程语言
- Linux 系统注册系统服务流程
- 网新中英文企业手机电脑一体化建站 v3.9
- Mysql 中 “必知” 的单行处理函数