这一章节我们来结束一下生成器是单迭代器,而不是多迭代器。
我们在之前的章节已经提到过迭代器iter,他是支持多迭代器的
例如:
>>> string='abcde' >>> iter1=iter(string) >>> next(iter1) 'a' >>> iter2=iter(string) >>> next(iter2) 'a' >>> next(iter1) 'b' >>> next(iter2) 'b' >>>
从代码里面可以看到,iter1与iter2分别指向不同的迭代器,返回不同的结果
>>> g=(x**2 for x in range(3)) >>> next(g) 0 >>> iter(g) <generator object <genexpr> at 0x00BBF378> >>> iter(g) is g True >>> next(iter(g)) 1 >>>
从上面的代码可见,生成器支持迭代协议,本身就是迭代器,而且只支持一次活跃迭代,不支持多迭代。
我们下面将再举一个例子:
>>> g=(x*4 for x in 'abcde') >>> next(g) 'aaaa' >>> iter1=iter(g) >>> next(iter1) 'bbbb' >>> iter2=iter(g) >>> next(iter2) 'cccc' >>>
上面我们举的是生成器表达式的例子,同理,表达式函数也是一样
>>> def test(): for x in range(5): yield x >>> g=test() >>> next(g) 0 >>> iter1=iter(g) >>> next(iter1) 1 >>> iter2=iter(g) >>> next(iter2) 2 >>>
而且,对于内置类型支持多迭代器,并且在一个迭代器中传递并反映它们的原处修改。
>>> L=[1,2,3,4,5] >>> iter1=iter(L) >>> next(iter1) 1 >>> iter2=iter(L) >>> next(iter2) 1 >>> del L[2:] >>> next(iter1) 2 >>> next(iter1) Traceback (most recent call last): File "<pyshell#37>", line 1, in <module> next(iter1) StopIteration >>> next(iter2) 2 >>> next(iter2) Traceback (most recent call last): File "<pyshell#39>", line 1, in <module> next(iter2) StopIteration >>>
从上面的代码可以看见,当列表原处修改了,也会影响迭代器返回的值。
总结,这一章节我们介绍了生成器是单迭代器
这一章节就说到这里,谢谢大家
------------------------------------------------------------------
版权声明:本文为博主原创文章,未经博主允许不得转载。