zoukankan      html  css  js  c++  java
  • python生成器和迭代器

    生成器:

    通过列表生成式,我们可以直接创建一个列表,但是,收到内存限制,列表容量肯定是有限的,而且,创建一个包含100万个元素的列表,不仅占用大量的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间就白白浪费了。

    所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断地推算出后续的元素呢,这样就不必创建完整的list,从而节省大量的空间,在python中,这种一边循环一边计算的机制,成为生成器:generator

    生成器只有在调用时才会生成相应的数据,生成器只有一个next方法,我们创建了一个generator后,基本上永远不会调用next方法,而是通过for循环来迭代它,并且不需要关心StopIteration的错误。

    def fib(max):
        n,a,b=0,0,1
        while n < max:
            print(b)
            a,b=b,a+b
            n+=1
        return 'done'
    
    fib(10)

    以上为一个生成斐波那契数列的函数,但不是生成器只需将print改为yield就成为生成器。

    这样就是一个生成器了,可以用变量如f=fib(10),调用的时候

    迭代器:

    我们已经知道,可以直接作用于for循环的数据类型有以下几种:

    一类是集合数据类型,如list、tuple、dict、set、str等;

    一类是generator,包括生成器和带yield的generator function。

    可以使用isinstance()判断一个对象是否是Iterable对象。

    而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

    *可以被next()函数调用并不断返回下一个值的对象成为迭代器:Iterator。

    可以使用isinstance()判断是否为一个

    小结:

    凡是可作用于for循环的对象都是可迭代类型;

    凡事可作用于next()函数的对象都是迭代器对象,它们表示一个惰性计算的序列;

    集合数据类型如list、dict、str等是可迭代的但不是迭代器,不过可以通过iter()函数获得一个迭代器对象。

  • 相关阅读:
    时间日期事件处理、长按事件
    单选按钮触发事件、下拉列表触发事件
    事件
    笔记3
    笔记2
    笔记1
    布局管理器
    08、shell三剑客之sed
    07、shell三剑客之grep
    06、shell正则表达式
  • 原文地址:https://www.cnblogs.com/caibao666/p/6394504.html
Copyright © 2011-2022 走看看