迭代器和制作器的区别是啥?这个问题招聘面试的情况下常常做为灵魂拷问 。今日一起从定义到编码整理一遍,做为汇总和纪录。
区别是:
- 制作器的益处是延迟时间测算 ,一次返回一个結果。换句话说,它不容易一次形成全部的結果,这针对大信息量解决 ,可能十分有效 。
基本定义
- 迭代:当建立的对象能够被一个接一个载入里边的值,叫迭代。
目录、元组 、词典、字符串数组全是可迭代对象。数据、布尔值是不能迭代的对象 。 - 迭代器协议书:对象必须出示next()方法,根据它返回迭代中的下一项 ,直至返回停止抛出去StopIteration出现异常 。
- 可迭代对象:完成了迭代器协议书对象。list 、tuple、dict全是可迭代对象(Iterable) ,但并不是迭代器对象(Iterator)。
必须应用内建函数iter(),把这种都变为可迭代器对象(Iterable) 。 - for item in Iterable:循环系统的实质便是先根据iter()涵数获得可迭代对象Iterable的迭代器,随后对获得到的迭代器持续启用next()方法 ,
来获得下一个值并将其取值给item,当碰到StopIteration的出现异常后循环系统完毕。
实际操作一下
- 迭代器:Python中一个完成_iter_方法和_next_方法的类对象,便是迭代器。
>>> list = [1,2,3] >>> lt = iter(list) >>> print(next(lt)) 1 >>> print(next(lt)) 2 >>> print(next(lt)) 3 >>> print(next(lt)) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
- 制作器:实质上是动态性形成迭代的值 ,应用完立即丢掉,能够合理节约存储空间,但这种值只有被迭代一次 。
>>> def g(): ... for i in range(3): ... yield i ... >>> g = g() >>> next(g) 0 >>> next(g) 1 >>> next(g) 2 >>> next(g) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
yield句子与return句子一样 ,都具有返回的功效。但yield与return不一样,假如实行return句子,立即返回return后边关系式的值。但实行yield句子 ,返回的是一个制作器对象,并且这一制作器对象的当今值,便是yield句子后边跟的关系式的值 。启用yield句子后 ,当今涵数便会返回一个迭代器 ,并且涵数会中止实行,直至对该涵数开展下一次迭代。
制作器是一种可塑性的编码序列,如果我们必须建立一个 0~xxxxxxxxx 的编码序列 ,那样大的编码序列建立出去会占有运行内存,制作器就处理那样的难题 。
参照连接:
http://dwz.date/daG5
http://dwz.date/daG6