元组
元组是序列,但是具有不可变性,和字符串类似。从功能上来说,它们用来表示确定元素的集合,从语法上来说,它们通常被编写在圆括号而不是方括号中,它们支持任意类型、任意嵌套以及常见的序列操作。
元组好友两个专有的可调用方法,但它的独有方法没有列表那么多。
元组真正的特殊之处就在于一旦创建就无法被改变,就是说,元组是不可变的序列(只有一个元素的元组需要一个逗号作为结尾)
与列表和字典一样,元组支持混合类型和嵌套,但是不能增长或者缩短,因为它们是不可变的(包住元组的圆括号通常可以省略)
因为元组的不可变性,元组支持更少的操作,但是元组的提供了一种完整性的约束,在程序中以列表传递一个对象的集合,他可能在任何地方改变,但是元组则不会。这在某些大型的程序中是很有用的。
文件
文件对象是python代码调用电脑上存放的外部文件的主要接口,它能用于读取你保存在电脑上的任何东西。虽然文件是核心类型,但是他有些特殊之处:没有特殊的字面语法来创建文件。要创建一个文件对象,需要调用内置的open函数以字符串的形式传递给它一个外部的文件名以及一个可选的表示处理模式的字符串。
这就在当前的文件夹下创建了一个文件,并向他写入了文本,为了读取刚才所写的内容,重新以“read”处理模式打开文件,读取输入(忽略模式的话,这将是默认的)。之后将文件读至一个字符串,并显示它,对脚本而言,无论文件包含的数据是什么类型,文件的内容总是字符串:
文件还有很多其他的方法,后面学习。如今读取一个文件的最佳方法就是根本不读它,而是通过文件提供的一个迭代器在for循环或者其他上下文中自动逐行读取:
二进制字节文件
文本文件在3.X中通常以字符串的形式编码,而在2.X中则默认地写入字符串内容。这与之前使用的简单ASCIII码数据(与文件字节进行等价映射)没有关系。但是对于富类型数据,文件接口可以同时根据内容和python版本而改变。
python3.X在文件中的文本和二进制数据之间划出了一条清晰的界限。文本文件把内容显示为正常的str字符串,并且在写入和读取数据时自动执行Unicode编码和解码。而二进制文件把内容显示为一个特定的字节字符串,并且允许你不修改地访问文件内容。
python的struct模块可以同时创建和解析被打包过的二进制数据来写入一个二进制模式的文件:
读取并还原二进制数据实际上是一个对称的过程。
Unicode文件
如果文件没有使用我么平台默认的编码格式,为了访问文件中非ASCII编码的Unicode文本,我们可以直接传入一个编码名参数。在这种模式下,python文本文件自动在读取和写入是采用你指定的编码范式进行编码和解码。
同创情况下,这些自动编码和解码可以满足需求,因为文件在传输时处理编码事物,你可以直接把文本当做内存中的一个由字符构成的简单字符串进行处理而不必担心其中放入Unicode编码原型。如果需要,你可以通过进入二进制模式来查看文件中真正储存的内容。或者进行手动编码和解码。而且,同一字符串可以在不同的编码格式下编码,这提供了一种将数据翻译成不同的编码的方式——只要提供了正确的编码方式名称,文件中的不同类型字节可以被解码成内存中相同的字符串。
其他类文件工具
open函数能实现在python中对绝大多数的文件进行处理,而对于更高级的任务,python还有额外的类文件工具:管道、先进先出队列(FIFO)、套接字、按键值访问的文件等。
其他核心类型
集合是最近增加到专语言中的类型,它不是映射也不是序列,相反,它们是唯一的不可变的对象的无序集合。集合可通过调用内置的set函数创建,或者使用集合字面量和表达式创建,并且它支持一般的数学集合操作:
集合同时支持in函数的成员测试操作,而所有python中的其他集合类型也是如此:
此外,python最近添加了一些新的数值类型:十进制数(固定精度浮点数)和分数。它们都被用来解决浮点数的局限性和内在的不确定性。
Python最近还添加了布尔值,以及长期以来一直支持的特殊占位符对象None(它通常用来初始化变量和对象)
如何破坏代码的灵活性
需要强调的一点是,内置函数type返回的type对象是一个能告知其他对象类型的对象,该函数返回的结果在3.X中略有不同,因为类型(type)和类(class)已经完全合并起来了。
除了允许交互地访问对象,这个函数的实际应用是,允许编写代码来检查它所处理的对象的类型。Python中至少有3种方法可以做到这一点。
但是在Python中,并不推荐这样的检测,这是核心的Python概念,在代码中检验了特定的类型,实际上破坏了它的灵活性,即限制他职能使用一种类型工作。没有这样的检测,代码也许能够使用整个范围的类型工作。
即我们在Python中,编写对象(被支持的操作),而不是类型。这意味着,我们关注一个对象能做什么,而非它是什么。不关注于特定的类型意味着代码的。
用户自定义的类