我们可以简单地吧迭代看做是一种处理序列中元素的方式。
1.手动访问迭代器中的元素
我们需要处理某个可迭代对象中的元素,但是基于某种原因不能也不想使用for循环。
我们可以手动访问可迭代对象中的元素,可以使用next()
函数,然后自己编码来捕获StopIteration
异常。一般来说,StopIteration
异常是用来通知我们迭代结束的。但是如果是手动使用next()
函数,也可以命令它返回一个结束值,比如说None。
2.委托迭代
我们构建了一个自定义的容器对象,其内部持有一个列表、元组或其他的可迭代对象。我们想让自己的新容器能够完成迭代操作。
一般来说,我们可以定义一个__iter__()
方法,讲迭代请求委托到对象内部持有的容器上。
3.用生成器创建新的迭代模式
我们想实现一个自定义的迭代模式,使其区别于常见的内建函数。
如果想实现一种新的迭代模式,可以使用生成器函数来定义。
4.实现迭代协议
我们正在构建一个自定义的对象,希望它可以支持迭代操作,但是也希望能有一种简单的方式来实现迭代协议。
目前来看,要在对象上实现可迭代功能,最简单的方式就是使用生成器函数。
5.反向迭代
我们想要反向迭代序中的元素。
可以使用内建的reversed()
函数来实现。反向迭代只有在待处理的对象拥有可确定的大小,或者对象实现了__reversed__()
特殊方法时,才能奏效。如果这两个条件都无法满足,则必须首先讲这个对象转换为列表。在转换列表的过程中可能会消耗大量的内存,尤其是当可迭代对象较大时更是如此。
6.定义带有额外状态的生成器函数
我们想定义一个生成器函数,但是它还涉及一些额外的状态,我们希望能以某种形式将这种状态暴露给用户。
可以将暴露实现为一个类,然后把生成器函数的代码放到__iter__()
方法中即可。
7.对迭代器做切片操作
我们想对迭代器产生的数据做切片处理,但是普通的切片操作符在这里不管用。
可以使用itertools.islice()
函数
import itertools
for x in itertools.islice(c, 10, 20):
print(x)
8.跳过可迭代对象中的前一部分元素
我们相对某个可迭代对象做迭代处理,但是对于前面几个元素并不感兴趣,只想将他们丢弃掉。
itertools模块中有一些函数可用来解决这个问题。第一个是itertools.dropwhile()
函数。要使用它,只要提供一个函数和一个迭代对象即可。该函数返回的迭代器会丢弃掉序列中的前面几个元素,只要他们所提供的函数中返回True即可。这之后,序列中剩余的全部元素都会产生出来。
9.迭代所有可能的组合或者排列
我们想对一系列元素所有可能的组合或排列进行迭代。
itertools模块中提供了3中元素:
- 第一个是
itertools.permutations()
它接受一个元素集合,将其中所有的元素重排列为所有可能的情况,并以元组序列的形式返回。
items = ['a', 'b', 'c']
from itertools import permutations
for p in permutations(iterms):
print(p)
- 使用
itertools.conbinations()
可以产生输入序列中所有元素的全部组合形式。
from itertools import combinations
for c in combinations(iterms):
print(c)
对于combinations()
来说,元素之间的实际顺序是不予考虑的。
10.以索引-值对的形式迭代序列
我们想得到一个序列,但是又想记录下来序列中当前处理到的元素的索引。
内建的enumerate()
函数可以非常漂亮地解决这个问题。
mylist = ['a', 'b', 'c']
for index ,value in enumerate(mylist):
print(index, value)
11.同时迭代多个序列
我们想要迭代的元素包含在多个序列中,我们想同时对它们进行迭代。
可以使用zip()
函数来同时迭代多个序列。
xpts = [1, 2, 3]
ypts = [4, 5, 6]
for x, y in zip(xpts, ypts):
print(x, y)
12.在不同的容器中进行迭代
我们需要对许多对象执行相同的操作,但是这些对象包含在不同的容器内,而我们希望可以避免写出嵌套的循环处理,保持代码的可读性。
itertools.chain()
方法可以用来简化这个任务。它接受一系列可迭代对象作为输入并返回一个迭代器,这个迭代器能够有效地掩盖一个事实———你实际上实在对多个容器进行迭代。
from itertools import chain
a = [1, 2, 3]
b = [4, 5, 6]
for x in chain(a, b):
print(x)
13.合并多个有序序列,再对整个有序序列进行迭代
我们有一组有序序列,相对他们合并在一起之后的有序序列进行迭代。
对于这个问题,headq.merge()
函数正式我们所需要的。
import headq
a = [1, 2, 3]
b = [4, 5, 6]
for c in headq.merge(a,b):
print(c)