【Python 学习手册笔记】元组、文件及其他

本文深入探讨了Python中元组的特性、文件的使用方式以及对象引用和复制的概念。详细介绍了元组作为不可变序列的用途、通过偏移进行访问的方法以及与列表的区别。此外,文章还涵盖了文件的打开、读取和关闭过程,强调了对象引用数组的优势,并解释了如何使用pickle模块和struct模块进行对象和二进制数据的存储与解析。最后,提供了Python对象的比较、相等性和真值概念,以及文件上下文管理器的使用方法。
摘要由CSDN通过智能技术生成


第9章
元组、文件及其他

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

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


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


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


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


注意元组的不可变性只适用于元组本身顶层而并非其内容。例如,元组内部的列表是可以像往常那样修改的。
>>> T = (1, [2, 3], 4)
>>> T[1] = 'SPAM'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> T[1][0] = 'SPAM'
>>> T
(1, ['SPAM', 3], 4)

为什么有了列表还要元组?
Python的创造者接受过数学训练,并提到过把元组看成是简单的对象组合,把列表看成是随时间改变的数据结构。实际上,单词"元组"就借用自数学领域,它通常用来指关系数据库表的一行。


文件

打开文件
为了打开一个文件,程序会调用内置open 函数,首先是外部名,接着是处理模式。模式典型地用字符串,‘r' 代表为输入打开文件(默认值) , ’w‘ 代表为输出生成并打开文件,'a'代表为在文件尾部追加内容而打开文件。处理模式参数也可以指定为其他选项:在模式字符串尾部加上b可以进行二进制数据处理; 加上"+"意味着同时为输入和输出打开文件;第三个是可选参数,它能够用来控制输出缓存: 传入"0"意味着输出无缓存(写入方法调用时立即传给外部文件)。


使用文件
文件选代器是最好的读取行工具:文件也有个迭代器会自动地在for循环、列表解析或者其他选代语句中对文件进行逐行读取。


内容是字符串,不是对象:注意从文件读取的数据回到脚本时是一个字符串。所以如果字符串不是你所需的,就得将其转换成其他类型的Python对象。


close是通常选项:调用文件close方能将会终止对外部文件的连接。


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


文本文件把内容表示为常规的str字符串,自动执行Unicode编码和解码,并且默认执行末行转换。
二进制文件把内容表示为一个特殊的bytes字符串类型,并且允许程序不修改地访问文件内容。

通常,你必须使用bytes字符串处理二进制文件,并且用常规的str字符串处理文本文件.


用pickle存储Python 的原生对象
使用eval可以把字符串转换成对象,它是一个功能强大的工具。事实上,它有时太过于强大。eval会高高兴兴地执行Python的任何表达式,甚至是有可能会删除计算机上所有文件的表达式,只要给予必要的权限。如果你真的想储存Python原生对象,但又无法信赖文件的数据来源,Python标准库pickle模块会是个理想的选择。

pickle模块执行所谓的对象序列化(object serialization ),也就是对象和字节字符串之间的相互转换。

文件中打包二进制数据的存储与解析
struct模块能够构造并解析打包的二进制数据。从某种意义上说,它是另一个数据转换工具,它能够把文件中的字符串解读为二进制数据。


文件上下文管理器
它允许我们把文件处理代码包装到一个逻辑层中,以确保在退出后可以自动关闭文件,而不是依赖于垃圾收集上的自动关闭:
with open() as F:

引用 vs 拷贝
没有限制条件的分片表达式(L[:])能够复制序列。
字典copy方法( X.copy()) 能够复制字典。
有些内置函数(例如,list) 能够生成拷贝(list(L)) 。
copy标准库模块能够生成完整拷贝。


比较、相等性和真值
所有的Python对象也可以支持比较操作——测试相等性、相对大小等。Python的比较总是检查复合对象的所有部分,直到可以得出结果为止。事实上,当嵌套对象存在时,Python能够自动遍历数据结构,并从左到右递归地应用比较,要多深就走多深。过程中首次发现的差值将决定比较的结果。

>>> L1 = [1, ('a', 3)]
>>> L2 = [1, ('a', 3)]
>>> L1 == L2, L1 is L2
(True, False)
在这里Ll和L2被赋值为列表,虽然相等,却是不同的对象。

“==” 操作符测试值的相等性。Python运行相等测试,递归地比较所有内嵌对象。
“is” 表达式测试对象的一致性。Python测试二者是否是同一个对象(也就是说,在同一个内存地址中)。

注意一下短字符席会出现什么情况:应该能又一次得到两个截然不同的对象碰巧有着相同的值: "==" 应该为真,而is应该为假。但是因为在Python内部暂时储存并重复使用短字符串作为最佳化,事实上内存里只有一个字符串. ‘spam' 供Sl和S2分享。因此, "is" 一致性测试结果为真。为了得到更一般的结果,我们需要使用更长的字符串:
>>> S1 = 'spam'
>>> S2 = 'spam'
>>> S1 == S2, S1 is S2
(True, True)
>>> S1 = 'a longer string'
>>> S2 = 'a longer string'
>>> S1 == S2, S1 is S2
(True, False)


表9-3 :对象分类
对象类型          分类        是否可变
数字                  数值        否
字符串              序列        否
列表                  序列        是
字典                  对应        是
兀组                  序列        否
文件                  扩展        N/A
Sets                  集合        是
frozenset          集合         否
bytearray(3.0)   序列        是


Python 中真和假的含义
真和假的慨念是Python中每个对象的固有属性:每个对象不是真就是假:
数字如果非零,则为真。
其他对象如果非空,则为真。

表9 -4: 对象真值的例子
对象         值
"spam"     True
'""             False
[]              False
{}              False
1              True
0.0           False
None       False


None对象
Python还有一个特殊对象: None (表9 -4中最后一项). 总被认为是假. 这是Python 中一利3特殊数据类型的唯一值,一般都起到一个空的占位作用,与C语言中的NULL指针类似。记住. None不是意味着"未定义"。也就是说. None是某些内容,而不是没有内容(尽管起名字是没有内容)——它是一个真正的对象,并且有一块内存,由Python给定一个内置的名称。


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

Type对象
事实上,即使是类型本身在Python中也是对象类型(快速念三遍)。严格地说,对内置函数type(X) 能够返回对象X的类型对象。


赋值生成引用,而不是拷贝.


注意把空列表赋值给一个偏移值,会将空列表对象保存在这里,不过赋值空列表给一个分片,则会删除该分片.
>>> L = [1, 2, 3, 4]
>>> L[2] = []
>>> L
[1, 2, [], 4]
>>> L[2:3] = []
>>> L
[1, 2, 4]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值