第九章、元组、文件和其他

元组

元组由简单的对象组构成。元组与列表非常类似,只不过元组不能在原处修改(它们是不可变的),并且通常写成圆括号(而不是方括号)中的一系列项。

①、任意对象的有序集合:

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

②、通过偏移存取:

同字符串、列表一样,在元组中的元素通过偏移(而不是键)来访问。

③、属于不可变序列类型:

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

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

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

⑤、对象引用的数组:

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

1、实际应用中的元组:

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

如果圆括号里的单一对象是元组对象而不是一个简单的表达式,需要对Python进行特别说明。如果确实想得到一个元组,只要在这一个单个元素之后,关闭圆括号之前加一个逗号就可以了。

在不会引起语法冲突的情况下,Python允许忽略元组的圆括号。

②、转换、方法以及不可变性:

除了常量语法不同以外,元组的操作和字符串及列表是一致的。值得注意的区别在于“+”、“*”以及分片操作应用于元组时将返回新元组,并且元组不提供字符串、列表和字典中的方法。

列表解析也可用于元组的转换。

尽管元组的方法与列表和字符串不同,它们在Python2.6和Python3.0中确实由两个自己的方法——index和count就像对列表一样工作,但是,它们也针对元组对象定义了。

2、为什么有了列表还要元组:

元组的不可变性提供了某种完整性。

文件

文件这个主要内置对象类型提供了一种可以存取Python程序内部文件的方法。

简而言之,内置open函数会创建一个Python文件对象,可以作为计算机上的一个文件链接。在调用open之后,你可以通过调用返回文件对象的方法来读写相关外部文件。

1、打开文件:

为了打开一个文件,程序会调用内置open函数,首先是外部名,接着是处理模式。模式典型地用字符串'r'代表为输入打开文件(默认值),'w'代表为输出生成并打开文件,'a'代表为在文件尾部追加内容而打开文件。

①、处理模式参数也可以指定为其他选项:

在模式字符串尾部加上b可以进行二进制数据处理(行末转换和Python3.0 Unicode编码被关闭了)。

加上“+”意味着同时为输入和输出打开文件(也就是说,我们可以对相同文件对象进行读写,往往与对文件中的修改的查找操作配合使用)。

2、使用文件:

一旦存在一个文件对象,就可以调用其它方法来读写相关的外部文件。

①、文件迭代器是最好的读取行工具:

现在从文本文件读取文字行的最佳方式是根本不要读取该文件。

②、内容是字符串,不是对象:

注意从文件读取的数据回到脚本时是一个字符串。

③、close是通常的选项:

调用文件close方法将会终止对外部文件的链接。

④、文件是缓冲的并且是可查找的:

默认情况下,输出文件总是缓冲的,这意味着写入的文本可能不会立即自动从内存转换到硬盘——关闭一个文件,或者运行其flush方法,迫使缓存的数据进入硬盘。可以用额外的open参数来避免缓存,但是,这可能会影响性能。

3、实际应用中的文件:

①、Python3.0中的文本和二进制文件:

文本文件把内容表示为常规的str字符串,自动执行Unicode编码和解码,并且默认执行末行转换。

二进制文件把内容表示为一个特殊的bytes字符串类型,并且允许程序不修改地访问文件内容。

②、在文件中存储并解析Python对象:

需要注意的是,我们必须使用转换工具把对象转成字符串。

字符串rstrip方法去掉多余的行终止符。

字符串split方法,从某个自定义的分隔符的地方将整行断开,得到的结果就是一个子字符串列表。

内置函数eval能够把字符串当作可执行程序代码(从技术上来讲,就是一个含有Python表达式的字符串)。

③、用pickle存储Python的原生元素:

pickle模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具,也并不要求我们把字符串转换来转换去。它就像是超级通用的数据格式化和解析工具。

④、文件中打包二进制数据的存储与解析:

有些高级应用程序也需要处理打包的二进制数据,这些数据可能是C语言程序生成的。Python的标准库中包含一个能够在这一范围起作用的工具:struct模块能够构造并解析打包的二进制数据。

⑤、文件上下文管理器:

4、其他文件工具:

seek函数能够复位你在文件中的当前位置(下次读写将应用在该文指),flush能够强制性地将缓存输出写入磁盘(文件总默认进行缓存)等。

需要注意的是,虽然open函数及其返回的文件对象是Python脚本中通向外部文件的主要接口,Python工具集中还有其他类似的文件工具,还有其他可用的,例如:

①、标准流:

在sys模块中预先打开的文件对象,例如sys.stdout。

②、os模块中的描述文件:

处理整数文件,支持诸如文件锁定之类的较低级工具。

③、sockets、pipes和FIFO文件:

文件类对象,用于同步进程或者通过网络进行通信。

④、通过键来存取的文件:

通过键直接存储的不变的Python对象。

⑤、Shell命令流:

像os.popen和subprocess.Popen这样的工具,支持产生Shell命令,并读取和写入到标准流。

重访类型分类

①、对象根据分类类共享操作:例如,字符串、列表和元组都共享诸如合并、长度和索引等序列操作。

②、只有可变对象(列表、字典和集合)可以原处修改;我们不能原处修改数字、字符串或元组。

③、文件导出唯一的方法,因此可变性并不真的适用于它们——当处理文件的时候,它们的状态可能会修改,但是,这与Python的核心类型可比性限制不完全相同。

④、“数字”包含了所有数字类型:整数、浮点数、复数、小数和分数。

⑤、字符串包括str,以及Python3.0中的bytes和Python2.6中的unicode;Python3.0中的bytearray字符串类型是可变的。

⑥、集合类似于一个无值的字典的键,但是它们不能映射为值,并且没有顺序;因此,集合不是一个映射类型或者一个序列类型,frozenset是集合的一个不可变的版本。

对象灵活性

①、列表、字典和元组可以包含任何种类的对象。

②、列表、字典和元组可以任意嵌套。

③、列表和字典可以动态地扩大和缩小。

引用VS拷贝

引用是其他语言中指针的更高级模拟。

如果你的确需要拷贝,那么可以明确要求:

①、没有限制条件的分片表达式(L[:])能够复制序列。

②、字典copy方法(X.copy())能够复制字典。

③、有些内置函数(例如,list)能够生成拷贝(list(L))。

④、copy标准库模块能够生成完整的拷贝。

拷贝需要注意的是:无条件值的分片以及字典copy方法只能做顶层复制。也就是说,不能够复制嵌套的数据结构。如果你需要一个深层嵌套的数据结构的完整的、完全独立的拷贝,那么就要使用标准的copy模块——包括import copy语句,并编辑X=copy.deepcopy(Y)对任意嵌套对象Y做完整的复制。

比较、相等性和真值

所有的Python对象也可以支持比较操作——测试相等性、相对大小等。

有两种方法可以测试相等性:

①、“==”操作符测试值的相等性。

②、“is”表达式测试对象的一致性。

Python中不同的类型的比较方法:

①、数字通过相对大小进行比较。

②、字符串是按照字典顺序,一个字符接一个字符地对比进行比较。

③、列表和元组从左到右对每部分的内容进行比较。

④、字典通过排序之后的(键,值)列表进行比较。

⑤、数字混合类型比较(例如,1<'spam')在Python3.0中是错误的。

1、Python3.0的字典比较:

Python3.0中的比较的替代方法,要么编写循环来根据键比较值,要么手动比较排序的键/值列表——items字典方法的和内置的sorted足够了。

2、Python中真和假的含义:

①、数字如果非零,则为真。
②、其他对象如果非空,则为真。

③、Python还有一个特殊对象:None,总被认为是假。

④、bool类型:

            Ⅰ、当明确地用在真值测试时,True和False这些文字就变成了1和0,但它们使得程序员的意图更明确。

            Ⅱ、交互模式下运行的布尔测试的结果打印成True和False的字样,而不是1和0,以使得程序的结果更明确。

Python还提供了一个内置函数bool,它可以用来测试一个对象的布尔值。

3、Python的类型层次:

Python系统中的任何东西都是对象类型,而且可以由Python程序来处理。

4、Type对象:

即使是类型本身在Python中也是对象类型。

对内置函数type(X)能够返回对象X的类型对象。

Python中的其他类型

1、内置类型陷阱:

2、赋值生成引用,而不是拷贝:

3、重复能够增加层次深度:

4、留意循环数据结构:

5、不可变类型不可以在原处修改:

本章小结

我们在这一章学习了两种主要核心的对象类型:元组和文件。我们看到,元组支持所有一般的序列操作,但它们没有方法,因为是不可变的而不能进行任何在原处的修改。我们也看到,文件是内置open函数返回的并且提供读写数据的方法。我们探讨为了存储到文件当中,如何让Python对象来回转换字符串,而我们也了解了pickle和struct模块的高级角色(对象序列化和二进制数据)。最后,我们复习了一些所有对象类型共有的特性(例如,共享引用),讨论对象领域内常见的错误(“陷阱”)而完成这一章的内容。

你可能感兴趣的:(第九章、元组、文件和其他)