>>> from env_helper import info; info()
页面更新时间: 2022-07-16 20:02:57
运行环境:
    Linux发行版本: Debian GNU/Linux 11 (bullseye)
    操作系统内核: Linux-5.10.0-16-amd64-x86_64-with-glibc2.31
    Python版本: 3.9.2

4.3. 通用的序列操作

Python 中所有序列都可以进行一些特定操作,包括索引(indexing)、分片(slicing)、序列相加(adding)、乘法(multiplying)、成员资格、长度、最小值和最大值。

4.3.1. 索引

序列是被排成一列的对象(或事件),它是Python中最基本的数据结构。序列中的每个元素都分配一个数字,代表它在序列中的位置(索引),第一个索引是0,第二个索引是1,以此类推。另外,序列还可以倒数,-1代表最后一个。你可像下面这样使用编号来访问各个元素:

>>> greeting = 'Hello'
>>> greeting[0]
'H'
>>> greeting[-1]
'o'

4.3.2. 切片

切片,顾名思义,就是对序列进行切割,要我们想要的元素。切片操作的语法格式:[start:stop:step]。

  • start(开始索引):第一个索引的值是 0,最后一个是 -1。

  • stop(结束索引):切片操作符将取到该索引为止,但不包含该索引的值。

  • step(步长):默认是 1,也就是说,一个接一个切取。如果为 2,则表示隔一取一。步长为正数时,表示从左向右取;如果为负数,表示从右向左取;步长不能为0。

>>> tag=['q', 'u', 'i', 'w', 'p', 'o', 'q', 'u', 'i', 'c', 'k', 's', 't', 'a', 'r', 't', 's', 'p', 'a', 't', 'i', 'a', 'l', 'i', 't', 'e', 'q', 'u', 'i', 'c', 'k', 's', 't', 'a', 'r', 't', 'n', 'e', 'w', 'p', 'o']
>>> tag[32:-4]
['t', 'a', 'r', 't', 'n']
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[0:6]
[1, 2, 3, 4, 5, 6]
>>> numbers[-3:-1]
[8, 9]

我们可以将冒号后面的索引空着,代表文件的最后:

>>> numbers[-3:]
[8, 9, 10]

也可以将冒号前面的索引空着,代表文件的开头:

>>> numbers[:3]
[1, 2, 3]

实际上,要复制整个序列,可将两个索引都省略。

>>> numbers[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[3:6:3]
[4]
>>> numbers[10:0:-2]
[10, 8, 6, 4, 2]
>>> numbers[5::-2]
[6, 4, 2]
>>> numbers[:5:-2]
[10, 8]

4.3.3. 序列相加

可使用加法运算符来拼接序列。

>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]

[1, 2, 3, 4, 5, 6]

>>> 'Hello,' + 'world!'
'Hello,world!'
[1, 2, 3] + 'world!'

TypeError: can only concatenate list (not "str") to list

从错误消息可知,不能拼接列表和字符串,虽然它们都是序列。一般而言,不能拼接不同类型的序列。

4.3.4. 乘法

将序列与数x相乘时,将重复这个序列x次来创建一个新序列:

>>> 'python' * 5
'pythonpythonpythonpythonpython'
>>> [42] * 10
[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]

4.3.5. None、空列表和初始化

空列表是使用不包含任何内容的两个方括号[]表示的。如果要创建一个可包含10个元素 的列表,但没有任何有用的内容,可像前面那样使用[42]*10。但更准确的做法是使用[0]*10, 这将创建一个包含10个零的列表。然而,在有些情况下,你可能想使用表示“什么都没有”的值, 如表示还没有在列表中添加任何内容。在这种情况下,可使用None。在Python中,None表示什么 都没有。因此,要将列表的长度初始化为10,可像下面这样做:

>>> sequence = [None] * 10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]

代码清单2-3所示的程序在屏幕上打印一个由字符组成的方框。这个方框位于屏幕中央,宽度取决于用户提供的句子的长度。这些代码看似很复杂,但基本上只使用了算术运算:计算需要多少个空格、短划线等,以便将内容显示到正确的位置。

4.3.6. 成员资格

要检查特定的值是否包含在序列中,可使用运算符in。它检查是否满足指定的条件,并返回相应的值:满足时返回True,不满足时返回False。这样的运算符称为布尔运算符,而前述真值称为布尔值。

下面是一些in运算符的使用示例:

>>> permissions = 'rw'
>>> 'w' in permissions
True
>>> 'x' in permissions
False

users = [‘mlh’, ‘foo’, ‘bar’] input(‘Enter your user name:’) in users

>>> subject = '$$$ Get rich now!!! $$$'
>>> '$$$' in subject
True

开头两个示例使用成员资格测试分别检查’w’和’x’是否包含在字符串变量permissions中。在 UNIX系统中,可在脚本中使用这两行代码来检查对文件的写入和执行权限。接下来的示例检查 提供的用户名mlh是否包含在用户列表中,这在程序需要执行特定的安全策略时很有用(在这种情况下,可能还需检查密码)。最后一个示例检查字符串变量subject是否包含字符串’$$$’,这 可用于垃圾邮件过滤器中。

注意 相比于其他示例,检查字符串是否包含'$$$'的示例稍有不同。一般而言,运算符in检查 指定的对象是否是序列(或其他集合)的成员,但对字符串来说, 只有它包含的字符才是其成员或元素,因此下面的代码完全合理:

>>> 'P' in 'Python'
True

代码清单2-4所示的程序从用户那里获取一个用户名和一个PIN码,并检查它们组成的列表是 否包含在数据库(实际上也是一个列表)中。如果用户名-PIN码对包含在数据库中,就打印字符 串’Access granted’。

4.3.7. 长度、最小值和最大值

内置函数len、min和max很有用,其中函数len返回序列包含的元素个数,而min和max分别返回序列中最小和最大的元素。

>>> numbers = [100, 34, 678]
>>> len(numbers)
3
>>> max(numbers)
678
>>> min(numbers)
34
>>> max(2, 3)
3
>>> min(9, 3, 2, 5)
2