5.迭代器类型
Python支持对容器进行迭代的概念。他有两种不同的实现方法,但都可以归于使用用户自定义的类实现迭代。接下来,将详细解释说明:
第一种方法需要定义容器对象以提供迭代基础:
container. __iter__()
该方法返回一个迭代器对象,且该对象满足一系列迭代器控制协议。如果该容器支持不同类型的迭代对象,那么就可以提供额外的方法为这些迭代对象请求专用迭代器。此方法对应于Python / C API中Python对象的类型结构的tp_iter槽。
迭代器对象需要支持下述两个来自于迭代器控制协议的方法:
iterator. __iter__()
返回迭代器对象本身。这个请求允许迭代器和容器使用for和in语句。
iterator. __next__()
返回迭代器内的下一个元素。如果迭代器已经见底,则抛出StopIteration例外。
Python定义一系列迭代器对象用于支持包裹通用或专用序列类型、字典和其它更加特殊的结构。但不要担心那些特殊结构,他们都必须遵守迭代器控制协议。一旦一个迭代器的__next__()方法抛出了StopIteration,而且它依旧继续被调用的话,操作会因为不遵守规则而炸掉。
5.1 生成器类
Python的生成器提供了一个便捷的方法完成迭代器控制。如果一个容器对象的__iter__()方法被当做生成器运行,它会自动返回一个提供__iter__()和__next__()方法的迭代器对象。
6. 序列类型——list,tuple,range
下表内的操作都支持绝大多数的序列类数据,不管该序列是否是不可变序列。collections.abc.Sequence ABC使得在自定义序列类型上正确实现这些操作而变得简单。此表列出按升序优先级排序的序列操作。在表中,s和t是相同类型的序列,n,i,j和k是整数,x是满足由s施加的任何类型和值限制的任意对象。此外,in和not in操作具有和比较操作相同的优先级,+(级联)和*(重复)操作与和它长得特别像的数字操作拥有相同优先级。
操作 | 结果 |
x in s | 如果x与s内的某个元素相等,就返回True,否则返回False。 |
x not in s | 如果x与s内的所有元素都不相等,就返回True,否则返回False。 |
s + t | 将s与t连接起来 |
s * n 或 n * s | 等价于将s本身相加n次 |
s[i] | s的第i个元素,从0开始算起 |
s[i:j] | s的第I个到第j个元素组合 |
s[i:j:k] | s的第i个到第j个元素中符合步长k要求的元素组合 |
len(s) | s的长度 |
min(s) | s中最小的元素 |
max(s) | s中的最大元素 |
s. index(x[, i[, j]]) | 返回s中与x相等的第一个元素的序列值,或者第i到第j个元素中第一个与x相同的元素 |
s. count(x) | s中x出现的总次数 |
相同类型的序列也支持比较操作。具体来说,元组和列表通过比较顺序对应的元素确定是否相等。这意味着为了比较相等,每个元素必须相等并且两个序列必须是相同类型并具有相同长度。
6.2 不可变序列类型
通常通过对该类型内置的has()方法操作以达到操作该类型的目的,而不是操作该类型本身。
6.3 可变序列类型
下表列出了用于可变序列类型的操作。collections.abc.MutableSequence ABC使得这些自定义序列类型的处理变得更加容易。在表中s是可变序列类型的一个实例,t是可迭代对象,x是属性对象并且严格遵守c设定的类型与值的限制。
操作 | 结果 |
s[i] = x | s中的第i个元素被替换为x |
s[i:j] = t | s中的第i个到第j个元素被可迭代量t替换 |
del s[i: j] | 相当于s[I; j]=[] |
s[i: j: k] = t | s中从第i个元素到第j个元素,以k为步长,选中的元素被t中的元素值替代 |
del s[i: j: k] | 删除s中符合[i: j: k]规律的元素 |
s. append(x) | 在序列s的末尾增添一个元素,其值为x,与s[len(s):len(s)] = [x] |
s. clear() | 将s中的所有元素清除掉 |
s.copy() | 为s创建一个与其相同的副本 |
s. extend(t) 或 s += t | 用t的内容扩展s |
s *= n | 将s中的内容重复n次,并赋给新的s |
s. insert(I, x) | 将x插入到s中序列数为i的地方 |
s. pop([i]) | 将s的第i个元素弹出 |
s. remove(x) | 把s中第一个与x值相同的元素删除 |
s. reverse() | 释放s占用的空间 |
6.4 列表
列表是一个可变序列,通常用于存储同类项目的集合(精确的相似程度会因应用应用而异)。
classlist([iterable])
列表的构成方式有以下几种:
(1)使用一对方括号表示空列表,如:[]
(2)使用方括号,其中的项目用逗号分隔,如:[a],[a, b, c]
(3)使用列表理解:[x for xin iterable]
(4)使用类构造器:list()或list(iterable)
构造函数构建一个列表,其项目与iterable的元素值与元素顺序相同。iterable可以是序列,也可以是支持迭代的容器或迭代器对象。如果iterbale已经是一个列表,则复制被创建并返回副本,类似于iterable [:]。 例如,list('abc')返回['a','b','c']和列表((1,2,3))返回[1,2,3]。 如果没有给出参数,构造函数会创建一个新的空列表[]。
sort(*,key=None, reverse=False)
此方法就地对列表进行排序,对元素的升序排列。
6.5 元组
元组是不可变序列,通常用于存储异构数据的集合。
class tuple([iterable])
元组可以由以下方法构建:
(1)使用一对圆括号表示空元组,如:()
(2)单元素元组使用尾随逗号定义,如:a,或(a,)
(3)用逗号分隔元组元素,如:a,b, c或(a, b, c)
(4)使用内置的tuple()函数,如:tuple()或tuple(iterable)
6.6 范围
范围类型表示一个不可变的数字序列,通常用于在for循环中循环特定次数。其由以下类定义:
class range(stop)
class range(start, stop[, step])
该定义已在内置函数中说明,不再赘述。