Python笔记:第二部分 类型和运算 第9章 元组、文件与其他核心类型

文章目录

  • 元组
    • 属性
    • 常见元组字面量和运算
    • 基本应用
      • 特殊语法:逗号和圆括号
      • 转换、方法、和不变性
      • 为什么有了列表还需要元组
      • 重访元组:有名元组
  • 文件
    • 简介
    • 常见的文件操作
    • 基本应用
      • 打开文件
      • 使用文件
      • 文件的实际使用
      • 存储Python原生对象:pickle模块

元组

属性

  • 任意对象的有序集合
    与字符串、列表类似,元组是个基于位置有序对象集合(内容维持从左到右的顺序),与列表相同,元组可以嵌进任何类型的对象。
  • 通过偏移量存取
    元组中的元素通过偏移量而不是键来访问,它们支持所有基于偏移量的操作,例如索引分片
  • 属于“不可变序列”
    元组是序列,支持与字符串和列表许多相同的操作。然后与字符串相同,元组是不可变的,不支持使用与列表的任何原位置修改操作。
  • 固定长度、多样性、任意嵌套
    元组是不可变的,若要增长或缩短元组,需创造一个新副本。同时,元组可以包含其他的复合对象,支持任意嵌套
  • 对象引用的数组
    与列表相似,元组应被看作对象引用的数组。元组存储了指向其他对象的存取点(引用),而且对元组进行索引操作的速度较快。

常见元组字面量和运算

Python笔记:第二部分 类型和运算 第9章 元组、文件与其他核心类型_第1张图片

基本应用

特殊语法:逗号和圆括号

  • 如果想要圆括号里的单一对象元组对象而不是一个单一表达式,需要对Python进行特殊说明。
    如果想要一个元组,只需在单个元素之后,关闭圆括号之前加一个逗号即可。

>>>x = (40)     # An Integer
>>>x
40
>>>x = (40,)   # A  tuple containing an integer
>>>x
(40,)

注意 :Python允许你忽略元组的圆括号,在赋值语句上下文中,即使没有圆括号,Python也能识别出来这是一个元组。

  • 以下情况,必须对元组字面量使用圆括号
    1. 圆括号不可省略——出现在一个函数调用,或是嵌套在一个更大的表达式内。
    2. 逗号不可省略——嵌套在一个更大的列表、字典。
      注意 :最好建议一直使用圆括号,有助于增加脚本的可读性。

转换、方法、和不变性

  • 元组的操作和字符串与列表是基本一致的。值得注意的区别:当‘+’ ‘*’ 以及分片操作应用于元组时,会返回新的元组,并且元组不提供字符串、列表和字典中的方法。
  • 例如:倘若想对元组排序,需要将它转换成列表使其成为一个可变对象,才能使排序方法调用,或者使用新的内置函数sorted,它接受任何序列对象(以及其他可迭代对象)
>>>T = ('aa','bb','cc','dd')
>>>sorted(T)
['aa','bb','cc','dd']

sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
sorted(iterable, key=None, reverse=False)

  • iterable – 可迭代对象。
  • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,
  • 指定可迭代对象中的一个元素来进行排序。
  • reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
    返回重新排序的列表
  • 通过tuple内置函数将对象转换成元组
  • Python3.0后提供的元组的方法index()返回它的参数在元组中的位置count()统计元组里某个字符出现的次数。

Python count() 方法用于统计字符串/元组里某个字符出现的次数。可选参数为在字符串/元组搜索的开始与结束位置。
str.count(sub, start= 0,end=len(string))

  • sub – 搜索的子字符串
  • start – 字符串开始搜索的位置。默认为第一个字符,第一个字符索引值为0。
  • end – 字符串中结束搜索的位置。字符中第一个字符的索引为 0。默认为字符串的最后一个位置。
    该方法返回子字符串在字符串中出现的次数。

注意 :元组的不可变性只适用于元组本身顶层而非其内容。

>>>T = (1, [2, 3], 4)
>>>T[1] = 'spam'
TypeError: 'tuple' object does not support item assignment
>>>T[1][0] = 'spam'
>>>T
( (1, ['spam', 3], 4)

为什么有了列表还需要元组

  1. 列表:一种随时间改变的数据结构
  2. 元组:一种对象的简单结构
  • 元组借用于数学领域,常被只带关系数据库表的一行
  • 元组的不可变性提供了某种一致性,确保元组在程序不会被另一个引用修改,列表无此保证

重访元组:有名元组

  • 标准库collections模块中的namedtuple工具, 可以用来构建带字段名的元组和一个相应的类
  • 能同时支持使用序号属性名访问组件,也可以被转换成使用键类字典形式的访问。
  • 有名元组的属性名来自类,因此不与字典的键完全一样,但他们都很方便记忆。

使用nametupled构建的类的实例所消耗的内存与元组是一致的, 因为字段名都被保存在对应的类里面.
—— 译自 Fluent Python

  1. 声明方式 一
    nametuple 构造函数的首个参数为类名, 第二个参数为字段名信息, 可以是以空格隔开的字符串, 也可以是字符串数组
>>>from collections import namedtuple
>>>UserInfo = namedtuple('UserInfo', 'username' 'password' 'block vip')
>>>coding = UserInfo('coding', 'ShowMeTheCode', '0', '1')
>>>coding.password
'ShowMeTheCode'
>>>coding[1]
'ShowMeTheCode'
  1. 声明方式 二
    很 Pythonic 的解包方式进行声明
>>>columns = ['name', 'city', 'email']
>>>Contact = namedtuple('Contact', columns)
>>>contact = ['coding', 'Dongguan', '[email protected]']
>>>coding_contact = Contact(*contact)
>>>coding_contact.city
'Dongguan'

可以用元组进行解包声明, 这里就充分利用了元组的位置信息

contact_desciption = ('Contact', ['name', 'city', 'email', 'phone'])
Contact = namedtuple(*contact_desciption)

文件

简介

文件,常指计算机中由操作系统管理的具有名称的存储区域
这个主要内置对象类型提供了一种可以在Python程序内存存取文件的方式
简而言之,内置函数open可以创建一个Python文件对象作为到计算机上一个文件的链接。在调用open之后,你可以通过返回的文件对象的方法,在程序与相应文件之间来回传递串形式的数据。

常见的文件操作

Python笔记:第二部分 类型和运算 第9章 元组、文件与其他核心类型_第2张图片

基本应用

打开文件

  • Python内置**open()**函数用于打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写
  • 函数语法open(filename, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
  • 参数说明:
    1. filename : 【必须】,外部文件名,一个包含了你要访问的文件名称的字符串值。可能含有一个与平台相关的绝对或者相对目录路径。
    2. mode : 【可选】决定了打开文件的模式:只读,写入,追加等。默认文件访问模式为只读r
模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
  1. buffering : 【设置缓冲】如果 buffering 的值被设为 0,意味着输出无缓冲(写入方法调用时立即传给外部文件)。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
  2. encoding: 一般使用utf8
  3. errors: 报错级别
  4. newline: 区分换行符
  5. closefd: 传入的file参数类型

使用文件

在任何情况下,文件的文本在Python程序中都采用字符串形式。读取文件时会返回字符串形式的文本。写入文件时的文本作为字符串被传入write方法
6. 文本迭代器最适合逐行读取
7. 内容是字符串不是对象
8. 文件是被缓冲的以及可定位的
9. close通常是可选的,回收时自动关闭

文件的实际使用

操作方法 含义
.readall() 读入整个文件内容,返回一个字符串或字节流
.read(size=1) 从文件中读入整个文件内容,如果给出参数,读入前size长度的字符串或字节流
.readline(size=-1) 从文件中读入一行内容,如果给出参数,读入该行前size长度的字符串或字节流
.readlines(hint=-1) 从文件中读入所有行,以每行为元素形成一个列表,如果给出参数,读入hint行
字符串或字节流取决于文件打开模式 如果是以文本打开,返回字符串;否则则返回字节流
.write(s) 向文件写入一个字符串或者字节流
.writelines(lines) 将一个元素全为字符串的列表写入文件
.seek(offset) 改变文件操作指针的位置,offset的值。0——文件开头;1——当前位置;2——文件结尾

存储Python原生对象:pickle模块

  • pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。
  • pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,
  • pickle序列化后的数据,可读性差,人一般无法识别。
  1. pickle.dump(obj, file[, protocol])
    序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
  2. pickle.load(file)
    反序列化对象。将文件中的数据解析为一个Python对象。
  3. clear_memo()
    清空pickler的“备忘”。使用Pickler实例在序列化对象的时候,它会“记住”已经被序列化的对象引用,所以对同一对象多次调用dump(obj),pickler不会“傻傻”的去多次序列化。

你可能感兴趣的:(Python,笔记)