迭代器和生成器

迭代器
迭代(iterate)意味着重复多次,就像循环那样。本书前面只使用for循环迭代过序列和字典,但实际上也可迭代其他对象;实现了方法iter的对象。
方法iter返回一个迭代器,它是包含next的对象,而调用这个方法时可不提供任何参数。当你调用方法next时,迭代器应返回其下一个值。如果迭代器没有可供返回的值,应引发StopIteration异常。你还可以使用内置函数的便利函数next,在这种情况下,next(it)与it.next()等效。

斐波那契数列,表示该数列的迭代器如下:

class Fibs:
    def __init__(self):
        self.a = 0
        self.b = 1
    def __next__(self):
        self.a,self.b = self.b, self.a + self.b
        return sefl.a
    def __iter__(self):
        return self

首先,创建一个对象。
fibs = Fibs()
然后就在for循环中使用这个对象,如找出第一个大于1000的斐波那契数列。

for f in fibs:
    if f > 1000:
        print(f)
        break
...
1597

这个循环之所以会停止,时因为其中包含break语句;否则,这个for循环将会没玩没了的执行。


提示 通过对可迭代对象调用内置函数iter,可获得一个迭代器。

>>>it = iter([1,2,3])
>>>next(it)
1
>>>next(it)
2

还可使用它从函数或其他可调用对象创建可迭代对象


生成器
生成器是一种使用普遍函数语法定义得迭代器。生成器得工作原理到底是什么呢?通过示列来说明最合适。
创建生成器

nested = [[1,2],[3,4],[5]]
def flatten(nested):
    for sublist in sublist:
        for element in sublist:
            yield element

这个函数大部分代码都很简单。它首先迭代所提供嵌套列表中得所有子列表,然后按顺序迭代每个子列表的元素。倘若最后一行为print(element),这个函数将容易理解得多,不是吗?
在这里,你没有见过的是yield语句。包含yield语句的函数都被称生成器。这可不仅仅是值,而是可以生成多个值,每次一个。每次使用yield生成一个值后,函数都将冻结,即在此停止执行,等待被重新唤醒。被重新唤醒后,函数将从停止的地方开始执行。
为使用所有值,可对生成器进行迭代。

>>>nested = [[1,2],[3,4],[5]]
>>>for num in flatten(nested):
...     print(umu)
...
1
2
3
4
5
或
>>>list(flatten(nested))
[1,2,3,4,5]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值