Variables and Types¶
约 623 个字 10 行代码 预计阅读时间 2 分钟
1 内置类型¶
1.2 序列类型¶
通用序列操作¶
大多数序列类型,无论是可变类型还是不可变类型都支持下表中的操作,这里的 s
和 t
都是具有相同类型的序列,n
,i
,j
,k
是整数,x
是满足序列定义的任何元素。
x in s
如果s
中的某项等于x
,则返回True
,否则返回False
。- 在
str
与bytes
、bytearray
类型中,这也可以用于检查子序列:'ab' in 'abc'
返回True
。
- 在
x not in s
如果s
中的某项等于x
,则返回False
,否则返回True
。s + t
返回s
和t
拼接的序列。- 某些序列类型仅仅支持特定模式的项序列,因此不支持序列拼接或者重复,比如
range
。 - 拼接不可变序列总是会生成新的对象,重复拼接会导致运行时的开销巨大(序列总长度的平方级别),下面是一些可以降低开销到线性的方法:
- 对于
str
类型,可以使用str.join()
方法,或者写入io.StringIO
对象,结束的时候再获取值; - 对于
bytes
类型,可以使用bytes.join()
方法,或者写入io.BytesIO
对象,也可以使用bytearray
对象进行原地拼接,因为bytearray
是可变的,并且有高效的重分配机制; - 对于
tuple
类型,可以改为扩展list
类。
- 某些序列类型仅仅支持特定模式的项序列,因此不支持序列拼接或者重复,比如
s * n
或n * s
返回由s
的n
个拷贝构成的序列。- 但是序列
s
中的项并不会被拷贝,它们会被多次引用,所以会造成下面的问题:原因是[[]]
其实是一个包含了空列表的单元素列表,* 3
后结果的三个元素都是对这个空列表的引用,修改其中一个元素的值,其他两个也会受到影响,同时受到修改,但是按照下边这样就好了;
- 但是序列
s[i]
返回序列s
中的第i
个元素,i
是整数。s[i:j]
返回序列s
中的第i
到j - 1
个元素构成的序列,i
和j
是整数。j
是切片的终止位置,可以理解成尾后位置,这样的切片定义成所有满足i <= k < j
的索引号k
的项组成的序列。- 如果
i
或者j
超出了len(s)
,那么会被替换为len(s)
。 - 如果
i
为被省略或者被替换成None
,那么会被替换为0
,如果j
被省略或者被替换成None
,那么会被替换为len(s)
; - 如果
i >= j
,那么切片为空。
s[i:j:k]
返回序列s
从i
到j
步长为k
的切片,具体定义所有满足0 <= n < (j-i)/k
的索引号为i + n * k
的项组成的序列。如果i
或j
被省略或为None
,它们会成为“终止”,比如我们常用的s[::-1]
就会得到一个反转的列表。len(s)
返回序列s
的长度。max(s)
/min(s)
返回序列s
中的最大/最小值。- 如果序列为空,会抛出
ValueError
。
- 如果序列为空,会抛出
s.index(x[, i[, j]])
:x
在s
中首次出现项的索引号,后面两个是可选参数,分别表示在i
之后和在j
之前搜索。- 如果
x
不在s
中,会抛出ValueError
。
- 如果
s.count(x)
返回x
在s
中出现的次数,没出现就会返回0
。
文本序列类型¶
str
类型¶
Python 中的 str
是 Unicode 码位的构成的不可变序列。字符串字面值允许多种写法:
- 单引号:
'allows embedded "double" quotes'
; - 双引号:
"allows embedded 'single' quotes"
; - 三重引号:
'''Three single quotes'''
或"""Three double quotes"""
。
使用三重引号的字符串字面值可以跨越多行,所有的空白(包括换行符)都会被包含在字符串中,可以使用 \
来避免这种情况。