说一说Generator和Iterator

说一说Generator和Iterator但并非是一次性生成所有迭代成员的列表,而是在循环的过程中通过next下面的代码就可以获得一个generator:fromtypesimportG

大家好,欢迎来到IT知识分享网。

说一说Generator和Iterator

On the way of Pythonic…

Generator和iterator相伴相生,却不尽相同。

生成器(generator)

generator通常也是可迭代的,但并非是一次性生成所有迭代成员的列表,而是在循环的过程中通过next()方法不断获取后续元素。所以generator的存在可以节省内存资源(假如需要迭代一个包含海量数据的列表,那所占用的内存也会是不可忽略的)

下面的代码就可以获得一个generator:

from types import GeneratorType from collections import Iterable, Iterator g = (x for x in range(10)) print(isinstance(g, GeneratorType)) print(isinstance(g, Iterable)) print(isinstance(g, Iterator)) >>> True True True 

我们也可以自己定义一个generator,当然这就要用到yield关键字

from types import GeneratorType from collections import Iterable, Iterator def fib(max): a, b = 0, 1 while True: if b > max: return else: yield b a, b = b, a+b print(a, b) print(isinstance(fib(5), GeneratorType)) print(isinstance(fib(5), Iterable)) print(isinstance(fib(5), Iterator)) print for f in fib(5): print f >>> True True True 1 (1, 1) 1 (1, 2) 2 (2, 3) 3 (3, 5) 5 (5, 8) 
  • fib(5)就是一个generator, 同样也是一个iterator,所以支持用for来进行迭代。
  • yield和return同样都返回函数的值,区别在于return的返回是一次性的。yield只是返回了generator的一次迭代值, 函数的代码在yield返回迭代值后就会停止本次执行,yield之后以及之前的代码都只会在下次迭代执行。
  • generator在迭代完所有的值后,再次迭代(执行next()方法)会自动抛出StopIteration异常。但在for循环中无需处理该异常, 循环能够正常结束。

迭代器(iterator)

可以通过next()方法不断调用下一个迭代值的对象成为迭代器,迭代器支持for循环进行迭代。

  • 可迭代(Iterable)的数据类型包括,list, tuple, dict, set, str等,但这些数据类型并不是Iterator
  • Generator同样也是一个iterator,并且也是一种Iterable的数据类型
from types import GeneratorType from collections import Iterable, Iterator print(isinstance([], GeneratorType)) print(isinstance([], Iterable)) print(isinstance([], Iterator)) print(isinstance(iter([]), Iterator)) >>> False True False True 
  • 如果有必要,可以使用iter()函数将Iterabe的对象转换成Iterator对象。
说一说Generator和Iterator

To be continue…

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/50537.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信