第4章 介绍Python对象类型
原文目录
- 第4章 介绍Python对象类型
- Python知识结构
- 为什么要使用内置类型
- Python核心数据类型
- 数字
- 字符串
- 序列操作
- 不可变性
- 特定类型的方法
- 寻求帮助
- 字符串编程的其他方式
- Unicode字符串
- 模式匹配
- 列表
- 序列操作
- 特定的操作
- 边界检查
- 嵌套
- 推导
- 字典
- 重访嵌套
- 不存在的键:if测试
- 键的排序:for循环
- 迭代和优化
- 元组
- 为什么要使用元组
- 文件
- 二进制字节文件
- Unicode文本文件
- 其他类文件工具
*其他核心类型 - 如何破坏代码的灵活性
- 用户定义的类
- 剩余的内容
- 本章小结
- 本章习题
- 习题解答
Python知识结构
- 程序由模块构成
- 模块包含语句
- 语句包含表达式
- 表达式创建并处理对象
为什么要使用内置类型
- 内置对象使程序更容易编写
- 内置对象是可扩展组件
- 内置对象往往比定制的数据结构更有效率
- 内置对象是语言标准的一部分
简单来说:内置对象类型让编程变得更简单,并且内置对象类型更强大和高效,内置对象构成了每一个Python程序的核心部分。
Python核心数据类型
下表是Python内置对象类型和一些编写其字面量(literal)
所使用到的语法。
- 对象和操作集合绑定。
- Python是动态类型(Python会自动跟踪数据类型,而不必要求声明)
- Python是强类型语言(Python只能对一个对象类型进行适合该类型的有效操作)
数字
Python里的数字有整数、浮点数、复数等
字符串
字符串用来记录文本信息和任意的字节集合。
- 字符串是序列。
- 字符串是由单字符的字符串所组成的序列。(其他序列类型还包括列表和元组)
- 序列从左到右有顺序(索引)
序列操作
- 字符串通过
len
函数验证其长度,并通过索引
(index)操作得到其各个元素。第一个索引是0,第二个为1,依此类推。 - 字符串支持反向索引,最后一个是-1,倒数第二个是-2,依此类推。反向索引的等价表达式
s[-1] == s[len(s) - 1]
- 字符串索引可以使用任意表达式,而不仅仅是数字字面量。
- 序列支持
分片
(slice)的操作
s[start:end]
取出s中从偏移量start,直到但不包括end的内容
start默认为0(第一个,最左边)
end默认为字符串长度len(s),最后一个,最右边,注意len(s)是取不到的
利用默认值
s[1:]从第二个到结尾
s[:]整个字符串
- 字符串支持使用+进行拼接(concatenation)、支持使用*重复
不可变性
- Python字符串具有不可变性——在创建后不能原位置(in place)改变,换句话说,永远不能覆盖不可变对象的值。
- Python可以建立一个新的字符串以同一个变量名对其进行赋值。
- 数字、字符串、元组是不可变的;列表、字典、集合是可变的。
特定类型的方法
- 方法是指依赖并作用于对象上的函数,并通过一个调用表达式触发。
- s.
find('str')
查找,返回一个传入子字符串的偏移量,或者在没有找到的情况下返回-1 - s.
replace('str1','str2')
替换,使用str2替换str1 - 序列操作是通用的,但是方法不通用,例如分片对字符串、元组都适用,但是某些方法只对字符串有用。(序列操作方法、类型特定的方法)
寻求帮助
dir函数可以列出在调用者作用域内,形式参数的默认值;
另外dir会返回一个列表,其中包含了所有对象的所有属性。由于方法是函数的属性,他们也会在这个列表中出现,这样就能看到某种类型适用的所有方法。
help函数可以查询该方法具体是做什么的。
- dir和help命令都可以作用于一个真实对象(例如字符串S)
- dir和help也可作用于一种数据类型(例如str、list和dict)。
- help命令相较于dir命令而言,在返回相同函数列表的同时,还能提供完整的类型细节。
- 示例:dir(s)、help(s.replace)
字符串编程的其他方式
到目前为止,我们学习了字符串对象的序列操作方法和类型特定的方法。Python还提供了各种编写字符串的方法。
- 反斜线表示特殊的字符,转义。
- Python允许字符串包括在单引号和双引号中——采用不同的引号可以让另外一种引号被包含在其中。
- Python允许在三个引号(单引号或双引号)中包括多行字符串字面量,当采用这种形式的时候,所有的行都合并在一起,并在每一行的末尾增加换行符。
- Python支持原始(raw)字符串字面量,即去掉反斜线转义机制。这样的字符串字面量是以字母“r"开头,这个对Windows下的文件路径十分有用,如
r'C:\text\new'
Unicode字符串
模式匹配
列表
- Python的列表是最通用的序列
- 列表是一个任意类型的对象的位置相关的有序集合。
- 列表可变,可以通过对相应偏移量进行赋值修改。
序列操作
列表是序列的一种,它支持所有的我们队字符串所讨论过的序列操作。我们能对列表进行索引、切片等操作。
特定类型的操作
Python的列表与其他语言中的数组有些类似,但是要强大得多。
- 列表没有固定类型的约束。
- 列表没有固定大小。
边界检查
尽管列表没有固定的大小,Python仍不允许引用不存在的元素。超出列表末尾之外的索引会导致错误,对列表范围之外的赋值也是如此。
嵌套
Python核心数据类型的一个优秀特性就是支持任意的嵌套
。支持以任意的组合进行嵌套,并可以多个层次进行嵌套。这种特性的直接应用就是实现矩阵
。
推导
列表推导表达式list comprehension expression
列表推导表达式是一种处理矩阵的强大工具。
#row.py
M =[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
col2 = [a[1] for a in M]
print(col2)
#取出M里每个元素的第2个元素
#[2, 5, 8]
字典
- Python中字典不是序列,而是一种
映射mapping。
- 映射同样是一个其他对象的集合,但是它是通过键key而不是相对位置来存储独享的。
- 映射没有顺序,具有可变性。
映射操作
- 字典包含一系列的”键:值“对,直接使用大括号赋值可以创建字典。
d = {'food':'Spam', 'quantity':4, 'color':'pink'}
print(d['food'])
d['quantity'] += 1
print(d)
#Spam
#{'food': 'Spam', 'quantity': 5, 'color': 'pink'}
- 可以通过先创建空字典,再依次填充键值对。
d = {}
d['name'] = 'Bob'
d['job'] = 'dev'
d['age'] = 40
print(d)
#{'name': 'Bob', 'job': 'dev', 'age': 40}
- 可以通过向dict类型名中传递键值参数对(一种在函数调用时特殊的name=value的语法)
- 传递在运行时将键值对的序列进行zip配对的结果来创建字典。
bob1 = dict(name='Bob', job='dev', age=40)
print(bob1)
bob2 = dict(zip(['name', 'job', 'age'], ['Bob', 'dev', 40]))
print(bob2)
#{'name': 'Bob', 'job': 'dev', 'age': 40}
#{'name': 'Bob', 'job': 'dev', 'age': 40}
- 字典没有顺序。
重访嵌套
对字典的操作
d = {'name':{'first':'Bob', 'last':'Smith'},
'job':['dev', 'mgr'],
'age':40.5
}
print(d['name'])
print(d['name']['last'])
print(d['job'])
print(d['job'][-1])
d['job'].append('janitor')
print(d)
#{'first': 'Bob', 'last': 'Smith'}
#Smith
#['dev', 'mgr']
#mgr
#{'name': {'first': 'Bob', 'last': 'Smith'}, 'job': ['dev', 'mgr', 'janitor'], 'age': 40.5}
不存在的键:if测试
字典只支持通过键访问对象。访问一个不存在的键值会发生错误。
我们编写程序时并不知道字典存在什么键,这个时候可以通过if...in
语句来进行测试。
d = {'name':{'first':'Bob', 'last':'Smith'},
'job':['dev', 'mgr'],
'age':40.5
}
if 'job' in d:
print("right")
还有get方法、if/else三元表达式(实质上是挤在一行中的一条if语句)都可以进行字典的键测试。
键的排序:for循环
如果要在一个字典的元素中确实需要强调某种顺序?一个常用的解决办法:
通过字典的keys方法收集一个键的列表
,使用列表的sort方法进行排序,然后使用Python的for循环来逐个进行显示结果。
d = {'a':1, 'b':2, 'c':3}
ks = list(d.keys())
ks.sort()
print(ks)
for key in ks:
print(d[key])
#['a', 'b', 'c']
#1
#2
#3
迭代和优化
元组
元组tuple基本上就是不可变的列表。语法上使用圆括号,具有不可变性。
t = (1, 2, 3, 4)
#显示元素4的索引
print(t.index(4))
#计算4出现了几次
print(t.count(4))
#3
#1
为什么要使用元组
元组并不像列表一样常用,最关键的是不可变性。元组提供了一种完整性约束。
文件
文件对象是Python代码调用电脑上存放的外部文件的主要接口。虽然文件是核心类型,但是它有特殊性:没有特定的字面量语法来创建文件。要创建文件对象,需要调用内置的open函数以字符串的形式传递给它一个外部的文件名以及一个可选的表示处理模式的字符串。