零基础学python-19.10 生成器是单迭代器
零基础学python-19.10 生成器是单迭代器
raylee2015 发表于2年前
零基础学python-19.10 生成器是单迭代器
  • 发表于 2年前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

这一章节我们来结束一下生成器是单迭代器,而不是多迭代器。

我们在之前的章节已经提到过迭代器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
>>>

从上面的代码可以看见,当列表原处修改了,也会影响迭代器返回的值。

 

总结,这一章节我们介绍了生成器是单迭代器

这一章节就说到这里,谢谢大家

------------------------------------------------------------------

点击跳转零基础学python-目录


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

标签: 迭代器 python
共有 人打赏支持
粉丝 7
博文 265
码字总数 44224
×
raylee2015
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: