生成器与迭代器

筅森魡賤 提交于 2019-12-24 21:38:57

一、迭代器

迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代 器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供 一个迭代器的对象
next(iterator) 从迭代器iterator中获取下一了记录,如果无法获取下 一条记录,则触发stoptrerator异常
注意:
1.迭代器只能往前取值,不会后退
2.用iter函数可以返回一个可迭代对象的迭代器


a=[1,2,3,4,5] 
b=iter(a) 
print(type(b)) 
print(next(b)) 
print(next(b))
print(next(b)) 
for i in a: 
  print(i) 

二 、生成器

如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是 一个生成器
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是 一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运 行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。 调用一个生成器函数,返回的是一个迭代器对象。
生成器的作用
列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。
如:仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费 了。
如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出 后续的元素,这样就不必创建完整的list,从而节省大量的空间。
简单一句话:我又想要得到庞大的数据,又想让它占用空间少,那就用生成器!
生成器的工作原理:
(1)生成器(generator)能够迭代的关键是它有一个next()方法, 工作原理就是通过重复调用next()方法,直到捕获一个异常。
(2)可用next()调用生成器对象来取值。next 两种方式 t.next() 或者 next(t)。
(3)yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时, 代码从yield的下一条语句开始执行

def fbnq(n):
 a,b=0,1
 i=0
 while i<n:
 a,b=b,a+b
 yield a
 i+=1
f=fbnq(10)
for x in f:
   print(x) 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!