python序列类型:str、bytes、 bytearray、 list、 tuple、 range
python中,序列类型有str、bytes、 bytearray、 list、 tuple、 range。所谓序列,说明是有序的,可以通过索引做一些特定的操作。首先先了解序列对象中比较重要的两个:str 和 list,然后探讨下序列对象的共有操作。
字符串:str
Python中的文本数据由str对象或字符串处理。 字符串是Unicode编码(从python3开始)的不可变序列。可以通过把字符序列通过单引号、双引号、三引号来创建字符串。例如:
# Python 3.5.3 >>> test = "Hello\tworld!" >>> print(test) Hello world! >>> test 'Hello\tworld!'
#字符串中可以包含任何unicode编码中包含的字符。'\t'是转义字符,在打印输出中显示为多个空格(具体几个由操作环境决定)
# 在交互模式下直接输变量名,显示更能体现字符串在python中的存储方式
>>> d = r'c:\windows\sys\table' >>> d 'c:\\windows\\sys\\table'
# 'r'前缀,'raw'的缩写,会使大部分的转义失效
>>> sql = """select * from user where name='tom' """ >>> sql "select * from user where name='tom' "
# 可以在三引号中方便的使用单双引号
# 使用三引号可以方便的横跨多行,任何空白字符都会被包含到字符串中。
字符串是可迭代的。
列表:list
列表是可变的序列,通常用于存储同类数据的集合,不过一个列表中可以存储任意不同类型的数据。
列表可以通过不同的方式创建:
- 使用一对方括号来表示空列表:[]
- 使用一对方括号,括号中的元素用逗号隔开:
[a, b, c]
- 使用列表解析式:[x for x in iterable]
- 使用列表的类型构造函数:
list()
或list(iterable)
构造函数创建一个列表,其元素和作为参数的可迭代对象完全相同,元素的顺序也相同。可迭代对象可以是序列、支持迭代的容器或者一个可迭代对象。如果可迭代对象是一个列表,返回一个该列表的拷贝,功能类似于iterable[:]。如果没有参数,构造函数创建一个新的空列表,[]。
>>> lst = [1,2,3] >>> cp = list(lst) >>> cp [1, 2, 3] >>> lst is cp False
以下内容翻译自 file:///Library/Frameworks/Python.framework/Versions/3.5/Resources/English.lproj/Documentation/library/stdtypes.html#sequence-types-list-tuple-range
公共的序列操作
下面表中列出的操作适用于所有的序列类型,不论是可变序列还是不可变序列。
表中的操作是按优先级升序排列的。在表中,s和t是同一种序列类型,n,j,i,k表示整数,x是一个满足s所施加的任何类型和值限制任意对象。作为比较操作,in 和 not in 具有相同的优先级。
Operation | Result | Notes |
---|---|---|
x in s |
True如果序列s中的某个元素等于x , 否则False |
(1) |
x not in s |
False 如果序列s中的某个元素等于x, 否则True |
(1) |
s + t |
将s 和 t 串联,返回一个新的序列 |
(6)(7) |
s * n or n * s |
相当于将s自身相加n次 | (2)(7) |
s[i] |
序列s的第i个元素,索引从0开始 | (3) |
s[i:j] |
s的第i到j个元素,包含第i个元素,不包含第j个元素 | (3)(4) |
s[i:j:k] |
分片操作,每隔k个元素取s的第i到j个元素的一个元素 | (3)(5) |
len(s) |
s序列的长度 | |
min(s) |
序列s中最小的元素 | |
max(s) |
序列s中最大的元素 | |
s.index(x[, i[, j]]) |
在s中出现的第一个x元素的索引 (i及i索引之后,j索引之前) | (8) |
s.count(x) |
x在s中出现的总次数 | |
相同的列表类型支持比较。实际上,元组和列表通过比较对应索引位置的元素进行。也就是说,如果两个列表或者元组对象相等,那么它们的长度需要相同并且每一个元素必须相等。
注释:
-
in
和not in操作一般只用于普通的包含测试
, 一些特殊的序列,例如str、bytes、bytearray也将它们用于子序列测试:>>> "gg" in "eggs" True
-
小于0的值当作0对待 (产生一个和s序列类型相同的空序列)。需要注意的是序列s中的元素没有被拷贝,它们只是被引用多次。
>>> lists = [[]] * 3 >>> lists [[], [], []] >>> lists[0].append(3) >>> lists [[3], [3], [3]]
[[]]是一个包含了一个空列表的元素的列表,所以通过
[[]] * 3
产生的三个元素都引用同一个空列表。所以修改列表中的任意一个元素其实修改的是同一个列表。可以通过下面的方式创建一个包含不同列表元素的列表:>>> lists = [[] for i in range(3)] >>> lists[0].append(3) >>> lists[1].append(5) >>> lists[2].append(7) >>> lists [[3], [5], [7]]
- 如果i或j是负的,那么索引是相对于列表s末尾的,被替换为:
len(s) + i
或len(s) + j。但是-0还是0.
-
从i到j的分片操作定义一个新的带有索引k的项的序列,
i <= k < j。如果i或者j大于
len(s)
, 使用len(s)。如果i被省略,使用0。如果j被省略,使用len(s)。如果i大于等于j,那么返回的片段是空的。
(未完待续)