美文网首页
Python 迭代器与生成器

Python 迭代器与生成器

作者: Wonz | 来源:发表于2020-08-23 18:32 被阅读0次

    迭代器

    wiki百科:在 Python 中,迭代器是遵循迭代协议的对象。使用 iter() 从任何序列对象中得到迭代器(如 list, tuple, dictionary, set 等)。另一种形式的输入迭代器是 generator(生成器)。

    举例
    # 迭代器部分
    # 简单的遍历方法
    for item in [1,2,3,4,6]:
        print(item)
    
    # 不使用for进行遍历
    a = iter([1,2,3,4,6])
    print(next(a))
    print(next(a))
    

    输出:

    1
    2
    3
    4
    6
    1
    2
    

    个人理解:

    函数 next() 每次只迭代一次,因此只返回一个值。

    生成器

    廖雪峰解释:通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

    生成器也是一种只能迭代一次的迭代器,因为它们并没有把所有的值存在内存中,而是在运行时生成值。

    生成器都是迭代器,但迭代器不一定是生成器。

    作用:节省内存,只需要在用的时候计算元素的值就行。适合处理非常大的文件。

    举例
    # 生成器
    # 生成器有两种产生方式,一种是列表生成式加括号,比如 range() 函数,另一种一般通过 yield 去实现
    def reverse(data):
        for index in range(len(data)-1, -1, -1):
            yield data[index]
    
    for char in reverse("0123456789"):
        print(char)
    

    输出:

    9
    8
    7
    6
    5
    4
    3
    2
    1
    0
    

    个人理解:

    在 Python 2 中,xrange 用法与 range 完全相同,所不同的是生成的不是一个数组,而是一个生成器。

    在 Python 3 中,range() 是像 xrange() 那样实现,xrange() 被抛弃。

    参考资料

    python中yield的用法详解——最简单,最清晰的解释

    Python中的闭包

    相关文章

      网友评论

          本文标题:Python 迭代器与生成器

          本文链接:https://www.haomeiwen.com/subject/ujbujktx.html