Python with语句和过程抽取思想

python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会执行规定的__exit__(“清理”)操作,释放被访问的资源,比如有文件读写后自动关闭、线程中锁的自动获取和释放等。

与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操作文件的流程一般就是这三步:

1.[进入]用只读方式打开文件

如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在

2.[执行]读取文件内容

如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示

3.[退出]关闭打开的文件

文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

思考为什么关闭文件操作一定要放在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语句的执行原理

从解释器的角度去理解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语句和过程抽取思想,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 深入浅析python with语句简介

    with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍).with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的"清理"操作,释放资源,比如文件使用后自动关闭.线程中锁的自动获取和释放等. 术语 要

  • Python 的 with 语句详解

    一.简介 with是从Python 2.5 引入的一个新的语法,更准确的说,是一种上下文的管理协议,用于简化try-except-finally的处理流程.with通过__enter__方法初始化,然后在__exit__中做善后以及处理异常.对于一些需要预先设置,事后要清理的一些任务,with提供了一种非常方便的表达. with的基本语法如下,EXPR是一个任意表达式,VAR是一个单一的变量(可以是tuple),"as VAR"是可选的. 复制代码 代码如下: with EXPR as

  • Python中的with语句与上下文管理器学习总结

    0.关于上下文管理器 上下文管理器是可以在with语句中使用,拥有__enter__和__exit__方法的对象. with manager as var: do_something(var) 相当于以下情况的简化: var = manager.__enter__() try: do_something(var) finally: manager.__exit__() 换言之,PEP 343中定义的上下文管理器协议允许将无聊的try...except...finally结构抽象到一个单独的类中,

  • 详解Python中with语句的用法

    引言 with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍).with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的"清理"操作,释放资源,比如文件使用后自动关闭.线程中锁的自动获取和释放等. 术

  • 理解Python中的With语句

    有一些任务,可能事先需要设置,事后做清理工作.对于这种场景,Python的with语句提供了一种非常方便的处理方式.一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄. Without the with statement, one would write something along the lines of: 如果不用with语句,代码如下: file = open("/tmp/foo.txt") data = file.read() file.

  • Python with语句和过程抽取思想

    python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会执行规定的__exit__("清理")操作,释放被访问的资源,比如有文件读写后自动关闭.线程中锁的自动获取和释放等. 与python中with语句有关的概念有:上下文管理协议.上下文管理器.运行时上下文.上下文表达式.处理资源的代码段. with语句的应用场景   编程中有很多操作都是配套使用的,这种配套的流程可以称为计算过程,Python语言为这种计算过程专门设计了一种结构:with语句

  • Python分支语句与循环语句应用实例分析

    本文实例讲述了Python分支语句与循环语句应用.分享给大家供大家参考,具体如下: 一.分支语句 1.if else语句 语法: if 条件判断: 执行的语句块1 else : 执行语句块2 当满足条件的时候则执行语句块1 ,不满足条件就执行语句块2 注意:1.条件判断后面要加冒号":": 2.执行语句块需要缩进[4个空格]. else 与 if对齐,else后面要加":",语句块缩进4个空格 ''' 从控制台输入年龄,如果年龄小于18岁,打印"未成年人禁

  • python Jupyter运行时间实例过程解析

    这篇文章主要介绍了python Jupyter运行时间实例过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.Python time time()方法 import time time_start=time.time() time_end=time.time() print('totally cost',time_end-time_start) import time print "time.time(): %f " % ti

  • Python实现word2Vec model过程解析

    这篇文章主要介绍了Python实现word2Vec model过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import gensim, logging, os logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) import nltk corpus = nltk.corpus.brown.sents()

  • python异常处理try except过程解析

    这篇文章主要介绍了python异常处理try except过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 某些时候我们能够预判程序可能会出现何种类型的错误,而此时我们希望程序继续执行而不是退出,此时就需要用到异常处理:下面是常用的几种异常处理方法 #通过实例属性 列表 字典构造对应的异常 class Human(object): def __init__(self, name, age, sex): self.name = name s

  • python with语句的原理与用法详解

    本文实例讲述了python with语句的原理与用法.分享给大家供大家参考,具体如下: 之前看到一篇博客说博主python面试时遇到面试官提问with的原理,而那位博主的博文没有提及with原理,故有此文. 关于with语句,官方文档中是这样描述的: The with statement is used to wrap the execution of a block with methods defined by a context manager (see section With Stat

  • 让你分分钟学会python条件语句

    Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 我们通过下图来简单了解下条件语句的执行过程: Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false. Python 编程中 if 语句用于控制程序的执行,基本形式为: if 判断条件:     执行语句... else:     执行语句... 其中"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围. els

  • Python pass语句作用和Python assert断言函数的用法

    目录 一.Python pass语句 二.Python assert断言函数 三.Python assert断言函数用法 一.Python pass语句 在实际开发中,有时候我们会先搭建起程序的整体逻辑结构,但是暂时不去实现某些细节,而是在这些地方加一些注释,方面以后再添加代码, 请看下面的例子: age = int( input("请输入你的年龄:") ) if age < 12 :     print("婴幼儿") elif age >= 12 an

  • python条件语句和while循环语句

    目录 一.条件语句 二.​while循环语句​ 以Python 3.x版本为主 一.条件语句 ​条件语句基本结构​ 0或null为false,其余则为true if 判定条件:语句块...可多行else:语句块...可多行 ​代码如下:​ day=12 # 多条件语句判断 if day<7: print('活动挑战失败,再接再厉!'); day+=6 elif day>=7 and day <14: print('奖品2选1,超大鼠标垫/定制冰箱贴'); elif day>=14

随机推荐