其他控制语句,也就是说一个with... as...语句。

  这是python非常精妙的一个语句,非常的简单但是作用非常大,在打开文件获得句柄的时候可以用它,省去f.close()忘记添加的麻烦(这个文件的IO操作会用到)。

1.   with语句时什么?

  有一些任务,可能实现需要设置,时候做清理工作。对于这种场景,python的with语句提供了一种非常方便的处理方式。一个很好的例子就是文件处理,你需要获得文件句柄,从文件中读取数据,然后关闭文件。

  如果不用with语句,代码如下:

  1. file = open("/tmp/foo.txt")
  2. data = file.read()
  3. file.close()

  这里有两个问题。一是可能忘记关闭文件句柄;而是文件读取数据发生异常,没有进行任何处理。

  如果采用with的话,除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。

  1. with open("/tmp/foo.txt") as file:
  2. data = file.read()

2.   with是怎么工作的?

  我们有了上的这个例子可以得出with...as..的方法

  这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。

  下面例子可以具体说明with如何工作:

  1. class Sample:
  2. def __enter__(self):
  3. print "In __enter__()"
  4. return "Foo"
  5.  
  6. def __exit__(self, type, value, trace):
  7. print "In __exit__()"
  8.  
  9. def get_sample():
  10. return Sample()
  11.  
  12. with get_sample() as sample:
  13. print "sample:", sample

  运行代码,输出如下:

  In __enter__()
  sample: Foo
  In __exit__()

  正如你看到的
  1. __enter__()方法被执行
  2. __enter__()方法返回的值 - 这个例子中是"Foo",赋值给变量'sample'
  3. 执行代码块,打印变量"sample"的值为 "Foo"
  4. __exit__()方法被调用
  with真正强大之处是它可以处理异常。可能你已经注意到Sample类的__exit__方法有三个参数- val, type 和 trace。 这些参数在异常处理中相当有用。我们来改一下代码,看看具体如何工作的。

  举例如下:

  1. class Sample:
  2. def __enter__(self):
  3. return self
  4.  
  5. def __exit__(self, type, value, trace):
  6. print "type:", type
  7. print "value:", value
  8. print "trace:", trace
  9.  
  10. def do_something(self):
  11. bar = 1/0
  12. return bar + 10
  13.  
  14. with Sample() as sample:
  15. sample.do_something()

  这个例子中,with后面的get_sample()变成了Sample()。这没有任何关系,只要紧跟with后面的语句所返回的对象有__enter__()和__exit__()方法即可。此例中,Sample()的__enter__()方法返回新创建的Sample对象,并赋值给变量sample。
代码执行后:

  1. bash-3.2$ ./with_example02.py
  2. type: <type 'exceptions.ZeroDivisionError'>
  3. value: integer division or modulo by zero
  4. trace: <traceback object at 0x1004a8128>
  5. Traceback (most recent call last):
  6. File "./with_example02.py", line 19, in <module>
  7. sample.do_something()
  8. File "./with_example02.py", line 15, in do_something
  9. bar = 1/0
  10. ZeroDivisionError: integer division or modulo by zero

  实际上,在with后面的代码块抛出任何异常时,__exit__()方法被执行。正如例子所示,异常抛出时,与之关联的type,value和stack trace传给__exit__()方法,因此抛出的ZeroDivisionError异常被打印出来了。开发库时,清理资源,关闭文件等等操作,都可以放在__exit__方法当中。
  因此,Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。

另外,在异常处理单元,我们说过一个except...as...,请参照条件控制语句的异常处理部分

3. 其他控制语句

  3.1 推导式:

  推导式(comprehensions)又称为解析式,是Python的一种独有的特性。推导式可以从一个数据序列构建另一个新的数据序列的结构体。常用的有三种推导式,其他推导式跟这个形式一样。

  格式:推导式(以列表推导式为例)

  variable = [out_exp_res for out_exp in input_list if out_exp == 2]

  举例1:列表推导式

  1. multiples = [i for i in range() if i % is ]
  2. print(multiples)
  3. # Output: [, , , , , , , , , ]

  举例2:使用() 生成generator

  1. multiples = (i for i in range() if i % is )
  2. print(type(multiples))
  3. # Output: <type 'generator'>

  举例3:大小写key合并

  1. mcase = {'a': , 'b': , 'A': , 'Z': }
  2. mcase_frequency = {
  3. k.lower(): mcase.get(k.lower(), ) + mcase.get(k.upper(), )
  4. for k in mcase.keys()
  5. if k.lower() in ['a','b']
  6. }
  7. print mcase_frequency
  8. # Output: {'a': , 'b': }

  举例4:快速更换key和value

  1. mcase = {'a': , 'b': }
  2. mcase_frequency = {v: k for k, v in mcase.items()}
  3. print mcase_frequency
  4. # Output: {: 'a', : 'b'}

  举例5:集合推导式

  1. squared = {x** for x in [, , ]}
  2. print(squared)
  3. # Output: set([, ])

Python笔记_第一篇_面向过程_第一部分_6.其他控制语句(with...as等)的更多相关文章

  1. Python笔记_第一篇_面向过程_第一部分_2.内存详解

    Python的很多教材中并没有讲内存方面的知识,但是内存的知识非常重要,对于计算机工作原理和方便理解编程语言是非常重要的,尤其是小白,因此需要把这一方面加上,能够更加深入的理解编程语言.这里引用了C语 ...

  2. Python笔记_第一篇_面向过程_第一部分_6.条件控制语句(if)

    Python正如其他语言一样存在两种常用的逻辑判断体(也叫结构化程序设计).所谓逻辑判断体是通过你想要完成的编程思路,通过在逻辑判断体中的相互判断和作用得到你想要的结果.逻辑判断体也叫控制语句,Pyt ...

  3. Python笔记_第二篇_面向过程_第二部分_2.路径、栈和队列、内存修改

    这一部分分三个主题进行讲解,主要为后面的模块.包.第三方库的概念补充一些相关的内容. 1. 路径(Path): 相对路径和绝对路径. 举例1:我们先导入一个os库(模块)来观察一下路径 import ...

  4. 四、java基础-面向过程_对象_类中可出现的因素

    1.面向过程和面向对象区别: 1)面向过程:开发一个应用程序.一个项目,必须先了解整个过程,了解各个步骤.模块间的因果关系,使的面向过程方式去开发程序时,代码和代码之间的关联程度是非常强.所以其中任何 ...

  5. python自动化开发-[第五天]-面向过程、模块、包

    今日概要: 1.内置模块 2.协程函数 3.递归 4.面向过程编程与函数编程 5.模块 6.包 7.re正则 一.内置模块 1.匿名函数lambda 定义:匿名函数通常是创建了可以被调用的函数,它返回 ...

  6. python第四周迭代器生成器序列化面向过程递归

      第一节装饰器复习和知识储备------------ 第一节装饰器复习和知识储备------------ def wrapper(*args,**kwargs): index(*args,**kwa ...

  7. [Python笔记]第八篇:模块

    本篇主要内容:python常用模块用法介绍 什么是模块 模块,用一大段代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性 ...

  8. [Python笔记]第三篇:深浅拷贝、函数

    本篇主要内容:深浅拷贝,自定义函数,三目运算,lambda表达式, 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import ...

  9. python之迭代器、生成器、面向过程编程

    一 迭代器 一 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不 ...

  10. python函数之协程与面向过程编程

    第一:协程 初步了解协程 def eater(): print('start to eat') while True: food=yield print('is eating food:%s'%foo ...

随机推荐

  1. mysql 索引使用教程

    1.什么索引 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的位置信息.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. ...

  2. 查看mysql表空间

    ,),'MB') as data_size, concat(,),'MB') as index_size from information_schema.tables group by TABLE_S ...

  3. 转载:Nginx做反向代理和负载均衡时“X-Forwarded-For”信息头的处理

    转载自:https://blog.51cto.com/wjw7702/1150225 一.概述 如今利用nginx做反向代理和负载均衡的实例已经很多了,针对不同的应用场合,还有很多需要注意的地方,本文 ...

  4. UVA - 11806 Cheerleaders (容斥原理)

    题意:在N*M个方格中放K个点,要求第一行,第一列,最后一行,最后一列必须放,问有多少种方法. 分析: 1.集合A,B,C,D分别代表第一行,第一列,最后一行,最后一列放. 则这四行必须放=随便放C[ ...

  5. 2016蓝桥杯省赛C/C++A组第九题 密码脱落

    题意: X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远,其中 ...

  6. POJ 2586:Y2K Accounting Bug

    Y2K Accounting Bug Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11297   Accepted: 56 ...

  7. Aduino Nano 技术性能指标

    纵览 在Adnuino Nano网站上节选了该控制器的价格等,在中国买非常便宜,我用10元左右的人民币就买到了这个产品,在Arduino网站上的价格是22美金,还不包括税.这种差别是如何造成的?是国外 ...

  8. 大二暑假第一周总结--初次安装配置Hadoop

    本次配置主要使用的教程:http://dblab.xmu.edu.cn/blog/install-hadoop-in-centos/ 以下是自己在配置中的遇到的一些问题和解决方法,或者提示 一.使用虚 ...

  9. 8.scrapy的第一个实例

    [目标]要完成的任务如下: ※ 创建一个 Scrap项目.※ 创建一个 Spider来抓取站点和处理数据.※ 通过命令行将抓取的内容导出.※ 将抓取的内容保存的到 MongoDB数据库.======= ...

  10. python脚本下载 Google Driver 文件

    使用python脚本下载 Google Driver 文件 import yaml import sys import requests import os import re import tarf ...