元组
元组是:
- 任意对象的有序集合;
- 通过偏移量存取;
- 属于“不可变序列”;
- 固定长度、多样性、任意嵌套;
- 对象应用的数组;
元组的实际应用
元组的拼接(+)
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)
元组的重复(*)
>>> (1, 2) * 4
(1, 2, 1, 2, 1, 2, 1, 2)
元组的特殊语法:逗号和圆括号
当元组中只有一个元素时,逗号和圆括号是必不可少的;
>>> X = (2)
>>> type(X)
<class 'int'>
>>>
>>> X = ("2")
>>> type(X)
<class 'str'>
>>>
>>> X = (1,)
>>> type(X)
<class 'tuple'>
转换、方法和不可变性
注意到元组这种数据类型是不可变的,所以想对元组进行排序更新等操作时,需要将元组变换成为可变的数据类型;
>>> T = ("cc", "bb", "aa", "dd")
>>>
>>> tmp = list(T)
>>>
>>> tmp.sort()
>>>
>>> tmp
['aa', 'bb', 'cc', 'dd']
>>>
>>> T = tuple(tmp)
>>>
>>> T
('aa', 'bb', 'cc', 'dd')
>>>
>>>
>>> T = ("cc", "bb", "aa", "dd")
>>> T.sorted(T)
>>>
>>>
>>> T = ("cc", "bb", "aa", "dd")
>>> sorted(T)
['aa', 'bb', 'cc', 'dd']
删除元组
元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组;
>>> T = ("cc", "bb", "aa", "dd")
>>>
>>> del T
>>>
>>> T
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'T' is not defined
元组也是迭代对象
>>> T = (1, 2, 3, 4)
>>>
>>> L = [i + 20 for i in T]
>>>
>>> L
[21, 22, 23, 24]
元组不可变只是顶层而非其内容
要注意一点是,元组的不可变性只适用于元组本身顶层而并非其内容。例如元组内部的列表可以像往常那样修改的:
>>> 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)
计算元组元素个数 len(T)
返回元组中元素最大值 max(T)
返回元组中元素最小值 min(T)
文件
打开文件
为了打开一个文件,程序会调用内置函数open,传入的参数首先是外部文件名,接着是文件的处理模式。
afile = open(filename, mode)
afile.method()
open函数的第一个参数是外部文件名,它可能含有一个与平台相关的绝对或相对目录路径前缀。如果没有这个路径,文件被默认为存在当前工作目录下。
open函数的第二个参数是处理模式,通常用字符串‘r’表示以输入模式打开文件(默认值),‘w’表示以输出模式生成并打开文件,‘a’表示在文件尾部追加内容并打开文件。
文件打开模式
模式 | 描写 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(Python 3 不支持)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
文件处理相关函数及方法
函数及方法 | 描述 |
---|---|
file.close() | 关闭文件。关闭后文件不能再进行读写操作。 |
file.flush() | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
file.fileno() | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
file.isatty() | 如果文件连接到一个终端设备返回 True,否则返回 False。 |
file.next() | Python 3 中的 File 对象不支持 next() 方法。返回文件下一行。 |
file.read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
file.readline([size]) | 读取整行,包括 “\n” 字符。 |
file.readlines([sizeint]) | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
file.seek(offset[, whence]) | 移动文件读取指针到指定位置 |
file.tell() | 返回文件当前位置。 |
file.truncate([size]) | 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
file.write(str) | 将字符串写入文件,返回的是写入的字符长度。 |
file.writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
使用文件
文件有如下的基础用法:
- 文件迭代器最适合逐行读取;
- 内容是字符串不是对象;
- 文件是被缓冲的以及可定位的;
- close通常是可选的:回收时自动关闭,释放操作系统的资源;