Python with语句的概率,不多说了直接上代码!
python中的with语句用于访问资源。它确保执行指定的__exit__(“清理”)操作,而不管释放被访问资源的处理过程中的错误或异常,例如读取和写入文件后自动关闭、线程中锁的自动获取和释放等。
python中与语句相关的概念包括:上下文管理协议、上下文管理器、运行时上下文、上下文表达式和处理资源的代码段。(nk.xcmnyy.com)
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操作文件的流程一般就是这三步:
1.[进入]用只读方式打开文件
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在
2.[执行]读取文件内容
如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示
3.[退出]关闭打开的文件(3g.0834nk.com)
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
思考为什么关闭文件操作一定要放在finallly语句里?
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现。
发现共性:
我们发现其实这种过程化的语句有共性,比如说在进去一个片段前必须做某种超赞,处理工作后又需要执行一个结束操作。比如上面的这段代码:
finally:
if f:
f.close()
就可以做一个封装。
使用with语句后,我们是这样打开一个文件的:
with open("a.txt", "r", encoding="utf-8") as f:
print(f.read())
这个with语句和前面的try ... finally结构是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
with语句的执行原理(www.xcjl0834.com)
从解释器的角度去理解with语句执行流程。
with语句的基本形式是:
with 表达式 as 变量:
语句块
这样的一段代码可以称为一个上下文(context),在执行with语句时,解释器会先求出表达式的值,这个值(对象)是一个上下文管理器,并且假设这个对象拥有如下类的构造方法:
def __enter__():
# 描述进入上下文的动作
pass
def __exit__():
# 描述退出上下文的动作
pass
with语句在求出这个上下文管理器对象之后,自动执行进入方法,并将这个对象的返回值赋值于 as 之后的变量,然后执行语句块。然后在退出上下文前,自动执行对象的退出方法。
python系统和标准库的一些类型定义了这对操作,可以直接用于with语句。比如文件对象就直接支持这一对操作,因此可以用在with语句的头部。
如果你也有类似的计算过程需要抽取出来,那么可以自定义一个类,并且包含进入、退出方法。
自定义open函数
自己实现才发现,使用装饰器和生成器就能很好的解决这个问题,不需要用到类构造方法来实现;
import contextlib # 引入上下文管理包
@contextlib.contextmanager # 给函数引入装饰器
def myopen(dir, mode):
print("开始")
f = open(dir, mode, encoding='utf-8')
try: # 上文
yield f
finally: # 下文
print("结束")
f.close()
with myopen("a.txt", 'r') as fobj: # 把try中的yield中的f赋值给fobj
# with会将with后面的函数中的yield赋值给fobj
for 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条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非空(null ...
- Python pass 语句使用示例
Python pass 语句的使用方法示例.Python pass是空语句,pass语句什么也不做,一般作为占位符或者创建占位程序,是为了保持程序结构的完整性,pass语句不会执行任何操作,比如: P ...
- Python学习教程(learning Python)--1.2.1 Python输出语句print基本使用
Python提供很多的内建(built-in)函数,使用者可以不用自己写代码就可以完成一个功能很强大的程序, 在Python里使用最多的(也许是)print函数主要用于用户输出信息. 基本用法:pri ...
- Python 条件语句
Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false. Py ...
- [翻译]Python with 语句
With语句是什么? Python's with statement provides a very convenient way of dealing with the situation wher ...
- python 循环语句 函数 模块
python循环语句 while循环语法结构 当需要语句不断的重复执行时,可以使用while循环 while expression: while_suite 语句ehile_suite会被连续不断的循 ...
- jmeter数据库,charles抓包,Python循环语句
jmeter数据库,charles抓包,Python循环语句 一.Jemeter数据库 添加jar包数据库 jemeter=>浏览 添加JDBC Connection Configuration ...
- Python import语句导入模块语法[转]
Python import语句导入模块语法 社区推荐:掘金是国内最活跃的技术社区,我们每日有优质Python开发实例分享,海量python开源库推送.来掘金,和更多懂技术的小伙伴交流. pytho ...
- python 基本语句
python 基本语句 在使用python的变量前必须给它赋值,因为python变量没有默认值. 获取用户输入值 此时需要注意:input函数的返回值为文本或字符串. 一些简单的函数 乘方 绝对值 将 ...
随机推荐
- #define和const的区别(转)
这个区别用从几个角度来说: 角度1:就定义常量说的话:const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型. 角度2:就起作用的阶段而言:define是在编译的预处理阶 ...
- 75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)
转换流: InputStreamReader 输入字节流转换成输入字符流OutputStreamWriter 输出字节流转换成输出字符流 总结:就是字节流转换成字符流,但是不能字节流转换成字节流 ...
- 接口使用Http发送post请求工具类
HttpClientKit import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamR ...
- Android 为点击事件添加震动效果
Android 点击Button 实现震动效果 学习自:网络 Overview 在Android 的点击效果中,遇到震动效果的还是很多的. 接下来就让我们看一下如何实现震动效果. 所需要的权限 如果我 ...
- kafka为什么快?
为什么Kafka那么快 原创 2016-07-18 fireflyc 写程序的康德 网上有很多Kafka的测试文章,测试结果通常都是"吊打"其他MQ.感慨它的牛B之余我觉得必要仔细 ...
- 用C语言实现yield
用C语言实现yield C/C++中没有yield语法,有的时候想用产生器,自己实现一个循环会感觉很麻烦.C/C++应该如何实现产生器呢? class FibonacciGenerator { pub ...
- __iomem作用
最近在看网卡驱动时查看ioremap函数发现调用最低层用__iomem修饰了ioremap的第一个参数(unsigned int)ioremap(S3C24XX_PA_CS8900, SZ_1M) + ...
- JAVA调用R脚本 windwos路径下
RConnection c = new RConnection();// REXP x = c.eval("source('D:\\\\jiaoben\\\\RJava_test.R',en ...
- Dubbo入门到精通学习笔记(十三):ZooKeeper集群的安装、配置、高可用测试、升级、迁移
文章目录 ZooKeeper集群的安装.配置.高可用测试 ZooKeeper 与 Dubbo 服务集群架构图 1. 修改操作系统的/etc/hosts 文件,添加 IP 与主机名映射: 2. 下载或上 ...
- pair的用法
如何定义?(初始化) 1. pair<int,int>p; 2.定义即初始化,也可以这个样子 pair<,); 里面的类型还可以是string,double等. 3.还可以这样子初始 ...