python解释器中主要内置类型有数字、序列、映射、类、实例和异常。
序列类型-list,tuple,range
有三种基本序列类型:list,tuple和range
通用序列操作
大多数序列类型,包括可变类型和不可变类型都支持下表中的操作。此表按优先级升序列出了序列操作,在表格中,s和t是具有相同类型的序列。n、i、j和k是整数而x是任何满足s所规定的类型和值限制的任意对象。
注意,in
和not in
操作具有与比较操作相同的优先级,+
(拼接)和*
(重复)操作具有与对应数值运算相同的优先级
运算 | 结果 | 注释 |
x in s | 如果s中某项等于x则结果为True,否则为False | 1 |
x not in s | 如果s中某项等于x则结果为False,否则为True | 1 |
s+t | s与t相拼接 | 6 7 |
s*n或n*s | 相当于s与自身进行n次拼接 | 2 7 |
s[i] | s的第i项,起始为0 | 3 |
s[i:j] | s从i到j的切片 | 3 4 |
s[i:j:k] | s从i到j步长为k的切片 | 3 5 |
len(s) | s的长度 | |
min(s) | s的最小项 | |
max(s) | s的最大项 | |
s.index(x,[,i[,j]]) | x在i中首次出现项的索引号(索引号在i或其后且在j之前) | 8 |
s.count(x) | x在s中出现的总次数 |
注释:
- 虽然
in
和not in
操作在通常情况下仅被用于简单的成员检测,某些专门化序列(例如str,bytes,和bytearray)也使用它们进行子序列检测 - 小于0的n值会被当作0来处理(生成一个与s同类型的空序列)。注意序列s中的项不会被拷贝,而是会被多此引用。例如:
原因就是[[]]
是一个包含了一个空列表的单元素列表,所以[[]]*3
结果中的三个元素都是对这一个空列表的引用。修改lists
中的任何一个元素实际上都是对这一个空列表的修改。我们可以用如下的方式创建以不同列表为元素的列表: - 如果i或j为负值,则索引顺序是相对于序列s的末尾,索引号会被替换为
len(s)+i
或len(s)+j
。但要注意-0依然为0 - s从i到j的切片被定义为所有满足
i<=k<j
的索引号k组成的序列。如果i或j大于len(s)
,则使用len(s)
。如果i被省略或为None
,则使用0。如果j被省略或为None,则使用len(s)
。如果i大于等于j,则切片为空 - s从i到j步长为k的切片被定义为所有满足
i <= k < j
的索引号k的项组成的序列。如果i或j大于len(s)
,则使用len(s)
。如果i被省略或为None,则使用0。如果j被省略或为None,则使用len(s)
。如果i大于等于j,则切片为空。 - 拼接不可变序列总是会产生新的对象。这意味着通过重复拼接来构建序列的运行时开销将会基于序列总长度的乘方。想要获得线性的运行时开销,我们必须改用下列替代方案之一:
a. 如果拼接 str 对象,你可以构建一个列表并在最后使用 str.join() 或是写入一个 io.StringIO 实例并在结束时获取它的值
b. 如果拼接 bytes 对象,你可以类似地使用 bytes.join() 或 io.BytesIO,或者你也可以使用 bytearray 对象进行原地拼接。 bytearray 对象是可变的,并且具有高效的重分配机制
c. 如果拼接 tuple 对象,请改为扩展 list 类
d. 对于其它类型,请查看相应的文档 - 某些序列类型(例如range)仅支持遵循特定模式的项序列,因此并不支持序列拼接或重复
- 当 x 在 s 中找不到时 index 会引发 ValueError。 不是所有实现都支持传入额外参数 i 和 j。 这两个参数允许高效地搜索序列的子序列。 传入这两个额外参数大致相当于使用 s[i:j].index(x),但是不会复制任何数据,并且返回的索引是相对于序列的开头而非切片的开头。
不可变序列类型
不可变序列类型通常实现了对hash()
内置函数的支持,而可变序列类型通常没有实现。这种支持允许不可变类型,例如tuple实例被用作dict键,以及存储在set和frozenset实例中。
尝试对包含有不可哈希值的不可变序列进行哈希运算将会导致TypeError。
可变序列类型
/待补充
列表
列表是可变序列,通常用于存放同类项目的集合。
class list([iterable])
可以使用多种方式构建列表:
- 使用一对方括号来表示空列表:
[]
- 使用方括号,其中的项以逗号分隔:
[a]
,[a,b,c]
- 使用列表推导式:
[x for x in iterable]
- 使用类型的构造器:
list()
或list(iterable)
构造器将构造一个列表,其中的项与iterable中的项具有相同的值和顺序。iterable可以是序列、支持迭代的容器或其他可迭代对象。如果iterable已经是一个列表,将创建并返回其副本,类似于iterable[:]
。例如,list('abc')
返回['a','b','c']
而list(1,2,3)
返回[1,2,3]
。如果没有给出参数,构造器将创建一个空列表[]
文本序列类型–str
在python中处理文本数据是使用str对象,也称为字符串。字符串是由Unicode码位构成的不可变序列。字符串字面值有多种不同的写法:
- 单引号:
'允许包含有 "双" 引号'
- 双引号:
"允许包含有 '单' 引号"
- 三重引号:
'''三重单引号'''
,"""三重双引号"""
使用三重引号的字符串可以跨越多行-其中所有的空白字符都将包含在该字符字面值中。
作为单一表达式组成部分,由空格分隔的多个字符串字面值会被隐式地转换为单个字符串字面值。也就是说,("spam " "eggs") == "spam eggs"
字符串的方法
**str.format(*args, kwargs)
执行字符串格式化操作。调用此方法的字符串可以包含字符串字面值或者以花括号{}
括起来的替换域。每个替换域可以包含一个位置参数的数字索引,或者一个关键字参数的名称。返回的字符串副本中每个替换域都会被替换为对应参数的字符串值。