返回介绍

第9章 元组、文件及其他

发布于 2024-01-29 22:24:16 字数 3271 浏览 0 评论 0 收藏 0

这一章我们将要探讨元组(无法修改的其他对象的集合)以及文件(计算机上外部文件的接口),这也将在我们深入了解Python的核心对象类型的部分画上一个圆满的句号。我们将会看到,元组是一个相关的简单对象,其实它的大部分执行操作在介绍字符串和列表的时候我们就已经学过了。文件对象是处理文件常用的并且全能的工具。对文件的基本概念将在本书后续章节出现有关文件的例子时进行进一步的补充。

这一章我们也将总结本书介绍过的所有核心对象类型的共有属性来作为本书这一部分的结论:关于相等、比较、对象复制等的概念。我们也会简要探讨Python工具箱中其他的对象类型。正如你会看到的,尽管我们已经涵盖了所有主要的内置类型,但Python中的对象远比我们到目前为止所介绍的要多得多。最后,我们将会看到几个对象类型的常见错误,探讨一些能够巩固所学知识的练习题来结束这一章的内容。

元组

本书介绍的最后一个Python集合类型是元组(tuple)。元组由简单的对象组构成。元组与列表非常类似,只不过元组不能在原处修改(它们是不可变的),并且通常写成圆括号(而不是方括号)中的一系列项。虽然元组不支持任何方法调用,但元组具有列表的大多数属性。让我们快速了解一下它的属性。具体如下所示。

任意对象的有序集合

与字符串和列表类似,元组是一个位置有序的对象的集合(也就是其内容维持从左到右的顺序)。与列表相同,可以嵌入到任何类别的对象中。

通过偏移存取

同字符串、列表一样,在元组中的元素通过偏移(而不是键)来访问。它们支持所有基于偏移的操作。例如,索引和分片。

属于不可变序列类型

类似于字符串,元组是不可变的,它们不支持应用在列表中任何原处修改操作。与字符串和列表类似,元组是序列,它们支持许多同样的操作。

固定长度、异构、任意嵌套

因为元组是不可变的,在不生成一个拷贝的情况下不能增长或缩短。另一方面,元组可以包含其他的复合对象(例如,列表、字典和其他元组等),因此支持嵌套。

对象引用的数组

与列表相似,元组最好看做是对象引用的数组。元组存储指向其他对象的存取点(引用),并且对元组进行索引操作的速度相对较快。

表9-1中列出了常见的元组操作。元组编写为一系列对象(从技术上来讲,是生成对象的表达式),用逗号隔开,并且用圆括号括起来。一个空元组就是一对内空的括号。

实际应用中的元组

和往常一样,让我们开始以交互式会话的方式探索实际应用中的元组。在表9-1中,元组没有方法(例如,append调用在这是不可用的)。然而,元组的确支持字符串和列表的一般序列操作。

元组的特殊语法:逗号和圆括号

表9-1中的第二和第四项应该做进一步说明。因为圆括号也可以把表达式括起来(参考第5章),如果圆括号里的单一对象是元组对象而不是一个简单的表达式,需要对Python进行特别说明。如果确实想得到一个元组,只要在这一单个元素之后、关闭圆括号之前加一个逗号就可以了。

作为特殊情况,在不会引起语法冲突的情况下,Python允许忽略元组的圆括号。例如,表9-1中第四行简单列出了四个由逗号隔开的项。在赋值语句中,即使没有圆括号,Python也能够识别出这是一个元组。

现在,有些人会告诉你,元组中一定要使用圆括号,而有些人会告诉你不要用(其他人都有自己的生活,并不会告诉你该怎样对待元组)。仅当元组作为常量传给函数调用(圆括号很重要)以及当元组在Python 2.X的print语句中列出(逗号很重要)的特殊情况下,圆括号才是必不可少的。

对初学者而言,最好的建议是一直使用圆括号,这可能会比弄明白什么时候可以省略圆括号要更简单一些。许多程序员也发现圆括号有助于增加脚本的可读性,因为这样可以使元组更加明确,尽管你的使用经验可能会有所不同。

转换、方法以及不可变性

除了常量语法不同以外,元组的操作(表9-1的中间行)和字符串及列表是一致的。值得注意的区别在于“+”、“*”以及分片操作应用于元组时将返回新元组,并且元组不提供字符串、列表和字典中的方法。例如,如果你想对元组进行排序,通常先得将它转换为列表并使其成为一个可变对象,才能获得使用排序方法调用的权限,或者使用新的sorted内置方法,它接受任何序列对象(以及更多):

这里的列表和元组内置函数用来将对象转换为列表,之后返回为一个元组。实际上,这两个调用都会生成新的对象,但结果就像是转换。

列表解析(List comprehension)也可用于元组的转换。例如,下面这个由元组生成的列表,过程中将每一项都加上20:

列表解析是名副其实的序列操作——它们总会创建新的列表,但也可以用于遍历包括元组、字符串以及其他列表在内的任何序列对象。我们将会看到,列表解析甚至可以用在某些并非实际储存的序列之上——任何可遍历的对象都可以,包括可自动逐行读取的文件。

尽管元组的方法与列表和字符串不同,它们在Python 2.6和Python 3.0中确实有两个自己的方法——index和count就像对列表一样工作,但是,它们也针对元组对象定义了:

在Python 2.6和Python 3.0之前,元组根本没有方法——对于不可变对象,这是一种旧的Python惯例,多年前在实际使用字符串的时候打破了这一惯例,更近一点,对于数字和元组都打破了这一惯例。

同样,注意元组的不可变性只适用于元组本身顶层而并非其内容。例如,元组内部的列表是可以像往常那样修改的。

对多数程序而言,这种单层深度的不可变性对一般元组角色来说已经足够了。这碰巧把我们引入下一节的内容。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文