zoukankan      html  css  js  c++  java
  • python中生成器和迭代器以及可迭代对象的区别

    先简单的总结一下三种之间的关系:

        生成器和迭代器都是可迭代对象, 而生成器是一类特殊的迭代器.对于生成器和迭代器我们都可以使用next()函数来获取其下一个返回值,当然也可以使用for...in...来获取他们的返回值,因为for...in...的本质其实就是不断的对对象不断的调用next()方法,关于for...in...的本质可在for...in...内部实现原理中查看.

    然后在进行分别说明:

        可迭代对象: 在python中通俗的来讲就是能够通过for...in...这类语句迭代读取一条数据供我们使用的对象就称之为可迭代对象(Iterable)例如列表(list),元组(tuple)等,我们还可以通过isinstance(obj, Iterable)来判断一个对象是不是可迭代对象.如果对象是可迭代对象则,isinstance的结果返回True

    >>> from collections import Iterable
    >>> obj = ['a','b',1,2]
    >>> isinstance(obj, Iterable)
    True
    >>> obj_1 = {3,5,6,7,2}
    >>> isinstance(obj_1, Iterable)
    True

        迭代器:  迭代器是一种对象,它能够记录可迭代对象每次迭代的数据的地址,以便每次迭代都可以返回下一条数据.在python中只要一个类实现了__iter__方法和__next__方法,那么这个类的实例对象就是一个迭代器.我们可以通过isinstance(obj_1, Iterator)来判断一个对象是不是可迭代对象,如果是则isinstance返回True.

    from collections import Iterator
    
    class Desc(object):
        def __iter__(self):
            pass
        
        def __next__(self):
            pass
    
    def main():
        print(isinstance(Desc(), Iterator))
    
    if __name__ == '__main__':
        main()

    上面代码执行的结果为 True

        生成器(generator)和迭代器的实现方式不一样,生成器可以通过生成器推导式或yield关键字来实现,两种方式如下:

    >>> gen = (i for i in range(10000))
    >>> gen
    <generator object <genexpr> at 0x00000000035DE200>
    def fib(n):
        current = 0
        num1, num2 = 0, 1
        while current < n:
            num = num1
            num1, num2 = num2, num1 + num2
            current += 1
            yield num
        return 'done'
    In [31]: F = fib(5)
    
    In [32]: next(F)
    Out[32]: 1
    
    In [33]: next(F)
    Out[33]: 1
    
    In [34]: next(F)
    Out[34]: 2
    
    In [35]: next(F)
    Out[35]: 3
    
    In [36]: next(F)
    Out[36]: 5
    
    In [37]: next(F)
    ---------------------------------------------------------------------------
    StopIteration                             Traceback (most recent call last)
    <ipython-input-37-8c2b02b4361a> in <module>()
    ----> 1 next(F)
    
    StopIteration: done

    对于上面这种使用yield方式创建的生成器,当我们next()去调用的时候, 函数fib会返回yield后面的值,并将函数fib挂起,当再次使用next()去调用的时候,函数fib接下来的逻辑(即while)会被继续执行,当while循环完之后如果在去使用next()调用函数fib就会抛出StopIteration  异常,而不会返回done,如果想获得返回值,则必须将异常捕获.

    结束语:本篇文章可能语言上表达的不是很清楚,如果大家有什么疑惑,或者指正的地方欢迎在评论区一起讨论





  • 相关阅读:
    小程序云开发 -- 云函数定时触发器配置
    小程序echarts 构建中国地图并锚定区域点击事件
    微信小程序接入百度OCR(身份证识别)
    微信小程序开发技巧总结(三)-- 云开发时效数据刷新和存储 (access_token等)
    微信小程序仿朋友圈功能开发(发布、点赞、评论等功能)
    微信小程序开发技巧总结(二) -- 文件的选取、移动、上传和下载
    SpringBoot Jpa 自定义查询
    SpringBoot Jpa 分页查询最新配置方式
    【软工】提问回顾与个人总结
    【软工】[技术博客] 用Monaco Editor打造接近vscode体验的浏览器IDE
  • 原文地址:https://www.cnblogs.com/fanlei5458/p/9235483.html
Copyright © 2011-2022 走看看