首页 新闻 搜索 专区 学院

很奇怪 去掉 print(list(g)) 之后 print(i) 才能执行 否则就不执行

0
悬赏园豆:120 [已解决问题] 解决于 2018-09-06 14:33

def y(list):
for i in list:
yield i

def exec(g):
print(list(g))
for i in g:
print(i)

t = (123, 'xyz', 'zara', 'abc')
g = y(t)
exec(g)

问题补充:

print(list(g))就会影响下面的输出

但是print(g)是不会影响的呢

超灬超的主页 超灬超 | 初学一级 | 园豆:21
提问于:2018-09-03 15:15
< >
分享
最佳答案
0

g是一个迭代器,这里迭代的是t,list(g)已经把t迭代完了,再加上一般迭代器是不能回溯的,所以后面在遍历g的时候是没什么可被迭代的了,换成next的写法就一目了然了

收获园豆:80
jello chen | 大侠五级 |园豆:7096 | 2018-09-03 20:57

在下小白 能否说的更详细一点 谢谢

超灬超 | 园豆:21 (初学一级) | 2018-09-04 09:34
其他回答(2)
0

执行了的

Masako | 园豆:1751 (小虾三级) | 2018-09-03 17:38

你的图只能看出来执行了 for 看不出来执行了print(i)呢

支持(0) 反对(0) 超灬超 | 园豆:21 (初学一级) | 2018-09-03 17:41

@超灬超: 这个迭代器到底了,没有next了,并没有进入循环

支持(2) 反对(0) Masako | 园豆:1751 (小虾三级) | 2018-09-03 18:07
1

我理解的很浅,
g=y(t) 这样得到的g其实是一个 iterator,这个迭代器只能执行一次,
当print时会执行一次,
后面 for i in g ,这个时候 g 是空的。

至于迭代器为什么只能执行一次,还不了解。

收获园豆:40
放逐人 | 园豆:638 (小虾三级) | 2018-09-03 18:21

我又看了一下:

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。(https://www.cnblogs.com/spiritman/p/5158331.html

支持(1) 反对(0) 放逐人 | 园豆:638 (小虾三级) | 2018-09-03 18:25

我觉得和指针差不多,迭代器存一个位置,每次调用next就走到下一个位置,走到尾巴就没有next了。
for循环的本质也是调用next去执行。

支持(1) 反对(0) Masako | 园豆:1751 (小虾三级) | 2018-09-03 18:27

@Masako: 后面我看了下,iterator的本意是用在大数据的处理,超出内存大小限制的数据,数据不读取到内存(对于这一点我还是不怎么理解)。(https://stackoverflow.com/questions/3266180/can-iterators-be-reset-in-python)

其实它已经超出语法的层面了。

支持(0) 反对(0) 放逐人 | 园豆:638 (小虾三级) | 2018-09-03 22:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册