美文网首页
迭代器和生成器

迭代器和生成器

作者: 数据小黑升值记 | 来源:发表于2019-03-06 21:39 被阅读0次

    Python 中的可迭代数据类型有:list,dic,tuple,set,可以适用dir函数查看可调用的方法。

    • Iterable 可迭代的 -- > iter #只要含有iter方法的都是可迭代的
    • [].iter() 迭代器 -- > next #通过next就可以从迭代器中一个一个的取值
    • 迭代器协议 —— 内部含有nextiter方法的就是迭代器

    迭代器的好处:

    • 从容器类型中一个一个的取值,会把所有的值都取到。
    • 节省内存空间,迭代器并不会在内存中再占用一大块内存, 而是随着循环 每次生成一个, 每次next每次给我一个

    生成器

    生成器函数

    def gen():
      for i in range(10):
          yield i
        
    g=gen()
    

    此时g是一个生成器,只有通过next方法调用后才会一个个返回值

    含有yield关键字的函数都是生成器函数

    生成器函数的特点

    • 调用之后函数内的代码不执行,返回生成器
    • 每从生成器中取一个值就会执行一段代码,遇见yield就停止。
    • 生成器函数 : 执行之后会得到一个生成器作为返回值
    g=gen()
    print(g)
    b=g.__next__()
    print(b)
    c=g.__next__()
    print(c)
    

    执行上述代码,打印的结果如下:

     <generator object gen at 0x000001F8B681F5C8>
    0
    1
    

    此时的g只是一个生成器,只有调用了next方法才会有返回值

    如何从生成器中取值:

    • for :如果没有break会一直取直到取完
    • next :每次只取一个
    • send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
    • 数据类型强制转换 :会一次性把所有数据都读到内存里

    生成器表达式

    • 模板: (条件成立想放在生成器中的值 for i in 可迭代的 if 条件)
        g=(i for i in range(10))
        d=[i for i in range(10)]
        print(g)
        print(d)
    

    把圆括号变为方括号则变成了列表推导式,打印结果如下:

        <generator object <genexpr> at 0x0000021DFE8DF5C8>
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    列表推导式占用内存,推导式也可以添加条件筛选功能,如下:

        [i*i for i in (1,2,3,4) if i%3 == 0]

    相关文章

      网友评论

          本文标题:迭代器和生成器

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