Python--迭代器和生成器

我们可以简单地吧迭代看做是一种处理序列中元素的方式。

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值