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

迭代器和生成器

作者: 数据小黑升值记 | 来源:发表于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