for x in y():这是如何工作的?
这个问题在这里已经有了答案:
使用yield
将函数转换为一个生成器。 生成器是一种特殊类型的迭代器。 for
总是循环遍历iterables,采取每个元素依次并将其分配给您列出的姓名(或名称)。
spinning_cursor()
返回一个生成器,在你开始迭代生成器之前, spinning_cursor()
中的代码实际上并不运行。 遍历生成器意味着函数中的代码将被执行,直至遇到yield
语句,此时表达式的结果将作为下一个值返回并再次暂停执行。
for
循环就是这样做的,它会调用生成器上next()
的等价物,直到生成器通过提高StopIteration
(发生函数返回时发出的信号)来发出信号。 next()
每个返回值依次分配给c
。
您可以通过在Python提示符下创建生成器来看到这一点:
>>> def spinning_cursor():
... cursor='/-|'
... i = 0
... while 1:
... yield cursor[i]
... i = (i + 1) % len(cursor)
...
>>> sc = spinning_cursor()
>>> sc
<generator object spinning_cursor at 0x107a55eb0>
>>> next(sc)
'/'
>>> next(sc)
'-'
>>> next(sc)
''
>>> next(sc)
'|'
这个特定的生成器永远不会返回,所以StopIteration
永远不会被提出, for
循环将永远持续下去,除非你StopIteration
脚本。
在Python中,for语句允许您遍历元素。
根据文件:
Python的for语句按照它们出现在序列中的顺序迭代任何序列(一个列表或一个字符串)的项目
这里,元素将是spinning_cursor()
的返回值。
for c in spinning_cursor()
语法中的for c in spinning_cursor()
是for-each
循环。 它将遍历由spinning_cursor()
返回的迭代器中的每个项目。
循环的内部将会:
b
,将其解释为退格(删除最后一个字符)。 注意这发生在循环的结尾,所以它不会在第一次迭代期间被写入,并且它在步骤1中共享flush调用。 spinning_cursor()
将返回一个生成器,在你开始迭代之前它不会真正运行。 它看起来会循环'/-|'
,为了永远。 这就像有一个无限的列表来迭代。
所以,最终的输出将是一个ASCII微调。 你会看到这些字符(在同一个地方)重复,直到你杀死脚本。
/
-
|
链接地址: http://www.djcxy.com/p/1539.html
上一篇: for x in y(): how does this work?
下一篇: How to inspect program state in the presence of generators/coroutines?