资讯专栏INFORMATION COLUMN

python疑问6:生成器,可迭代对象,迭代器区别和联系

happyfish / 3106人阅读

摘要:一个自定义的迭代器如下可迭代对象像等可以直接作用于循环的对象,称为可迭代对象。可迭代对象实现了方法用于返回迭代器。

生成器,可迭代对象,迭代器之间究竟是什么关系?
用一幅图来概括:

1.生成器
定义生成器
方式一:

//区别于列表生成式 gen = [x*x for x in range(5)]
gen = (x*x for x in range(5)) 
print(gen)  //Out: at 0x00000258DC5CD8E0>

方式二:

def fib():
    prev, curr = 0, 1
    while True:
        yield curr
        prev, curr = curr, curr + prev
f = fib()
print(f) //Out:

定义成功后,我们可以利用next()访问生成器下一个元素

print(next(gen)) //0
print(next(gen)) //1
...
print(next(gen)) //16
print(next(gen)) //StopIteration

但一般用for循环遍历

for n in gen:
    print(n) //0  1  4   9  16

2.迭代器
任何实现了__iter__和__next__()方法的对象都是迭代器。__iter__返回迭代器自身,__next__返回容器中的下一个值。所以生成器是特殊的迭代器,她内部具有这两种方法。
一个自定义的迭代器如下:

class Fib:
    def __init__(self):
        self.prev = 0
        self.curr = 1
 
    def __iter__(self):
        return self
 
    def __next__(self):
        value = self.curr
        self.curr += self.prev
        self.prev = value
        return value
f = Fib() 
count = 1 
for n in f:
    print(n)
    count = count+1
    if count>=10:
        break
//Out:1 1 2 3 5 8 13 21 34

3.可迭代对象
像list,tuple,set,dict,str等可以直接作用于for循环的对象,称为可迭代对象。可迭代对象实现了__iter__方法,用于返回迭代器。

demo = [1,2,3,4]
print(isinstance(demo, Iterable)) //True
iter_object = iter(demo)
print(iter_object) //

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41347.html

相关文章

  • Python 进阶之路 (九) 再立Flag, 社区最全的itertools深度解析(上)

    摘要:例如,以下对两个的相应元素求和这个例子很好的解释了如何构建中所谓的迭代器代数的函数的含义。为简单起见,假设输入的长度可被整除。接受两个参数一个可迭代的正整数最终会在中个元素的所有组合的元组上产生一个迭代器。 前言 大家好,今天想和大家分享一下我的itertools学习体验及心得,itertools是一个Python的自带库,内含多种非常实用的方法,我简单学习了一下,发现可以大大提升工作...

    tuantuan 评论0 收藏0
  • Python中的迭代对象迭代生成

    摘要:本文重点掌握可迭代的对象的定义掌握可迭代对象迭代器与生成器之间的关系和异同熟悉标准库中生成器。二迭代器迭代器介绍迭代器用于从集合中取出元素的对象。若想再次迭代须重建迭代器。迭代器检查方式调用,。区别可迭代的对象不是迭代器。 导语:本文章记录了本人在学习Python基础之控制流程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握可迭代的对象的...

    starsfun 评论0 收藏0
  • 为什么range不是迭代?range到底是什么类型?

    摘要:为什么不更规范点,令生成的是迭代器呢关于这个问题,我没找到官方解释,以下纯属个人观点。类型是什么以上是我对为什么不产生迭代器的一种解答。小结回顾全文,我得到了两个偏冷门的结论是可迭代对象而不是迭代器对象是不可变的等差序列。 showImg(https://segmentfault.com/img/bVbmKjd?w=6000&h=4000); 迭代器是 23 种设计模式中最常用的一种(...

    187J3X1 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<