深度实践OpenStack:基于Python的OpenStack组件开发—3.5.4 再论类型和循环

举报
华章计算机 发表于 2019/06/06 12:04:37 2019/06/06
【摘要】 本书摘自《深度实践OpenStack:基于Python的OpenStack组件开发》——书中第3章,3.5.4节,作者是喻涛、田亮、张家龙、赵利军、李飞。

3.5.4 再论类型和循环

前面介绍了Python的基本类型,其中list、tuple、string、dict、set等类型都是Python的集合类型,这些类型都有一个公共点,即它们都是可迭代类型。下面给出可迭代类型的粗略定义:可迭代类型是一种集合类型,这种类型本身或者稍加改造就支持循环操作。在Python中,可迭代类型包含:list、tuple、string、dict和set等集合类型,其他的集合类型,文件和类文件对象,输入/输出流以及生成器。

在讲解这些之前,先来学习一个非常重要的函数——type函数。type函数的作用很多,这里讲解它最主要的功能:返回传入参数的类型。

type([x for x in xrange(100)])

type("string")

Python中弱化了类型的概念,但是在进行运算时是有类型这个概念存在的。如果在编码过程中不明白某参数的类型,可以使用type函数来查询。

下面接着讲可迭代的数据类型。list、tuple、string、set这几种数据类型是可以直接迭代或者循环的,那么字典dict该如何进行迭代和循环?假设现在有一个字典,里边有很多数据,想获得这些键值对,可以采用以下方式:

方式1:

for key in dict_test: 

    print key

方式2:

for number,name in dict_test.iteritems(): 

    print number,name

采用第一种方式,能获得字典的键;采用第二种方式,可以一次性获得该字典的键

和值。

请注意代码中的加粗部分,这是第一次接触到这种形式的for循环,这种形式也是合法的for形式。例如:

list_test = [("awcloud",12,"network"), ("awcloud_eng",13,"storage")]

for name,code,typ in list_test: 

    print name,code,typ

输出结果如下:

awcloud 12 network

awcloud_eng 13 storage

当可迭代的变量本身的元素是可迭代的,并且是类似于list类型的,那么可以对其进行解包操作。简单地说,Python支持多元素赋值。为了更加清楚地了解这种特性,看一下这些代码:

tuple_test= ("awcloud",12,"network")

name,code,typ = tuple_test

注意,这种形式的代码是完全合法的,它的意思是,把tuple_test的第一个元素赋给name,把第二个元素赋给code,把第三个元素赋给typ。由于Python具有这样的特性,因此常见的值交换的操作可以这样进行:

a = 12

b = 24

a,b = b,a 

这样的代码也是合法的,上边这段代码的执行结果是a的值变更为24,b的值变更为12。这种方式减少了使用局部变量带来的内存消耗和性能损失,因此推荐使用这种方式。

有了以上的了解,下面继续来介绍类文件类型和输入/输出流。在实际的使用中,类文件类型可以划分到输入/输出流中,现在重点讲解类文件类型。和其他的语言一样,Python也有文件类型的处理,而且和其他语言中的操作方式一样。

file_obj = open(file_path,"r|w|ab+")

上边的代码创建了一个文件对象,其中“r、w、ab+”表示以什么方式打开文件,这里不再细述。主要看一下文件对象的使用:

方式1:

file_obj = open( file ,"rb") 

for line in file_obj.readlines():

    print line

方式2:

file_obj = open( file,"rb") 

for line in file_obj:

    print line

这两种方式代码的运行效果是一样的,但是,请注意加粗部分,方式1的代码执行加粗部分之后,文件会在内存中被全部展开;而方式2的代码则不一样,当使用到哪一行的时候,才把指定行在内存中展开。因此,从内存角度来看,方式1比方式2更加节省资源;从类型的角度来看,方式1的代码是把文件对象当作列表在使用,而方式2的代码则把文件对象当作可迭代对象或者生成器进行处理。

在这里,提出Python性能优化的第七条准则:在处理文件对象时,应该统一将文件对象当作可迭代对象或者生成器进行处理。

无论采用什么语言,在处理文件的时候,都会有异常处理,例如,在Java中经常采用try…catch…进行文件异常处理。同样地,在Python中也会遇到与文件相关的异常,例如:

try:do something with file object

cache: exception

finally:close file

看一下Python的另一种语法:

with open(file_path,"rb") as file_obj: 

    for line in file_obj:

        print line

with…as…语法默认包含了异常处理,表示只要不发生相关的异常,就执行with语法块所包含的部分;如果发生异常,则跳过该段代码。这种语法形式常常用于只需要进行try和finally块处理的操作,对于其余如需要在catch块中进行处理的操作,则并不适合。

当然,with…as…语法不仅可以用于file对象的处理,也可以用于其他异常处理的场景。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。