Pau*_*aul 73 python yield generator
我正在寻找代码来在终端中旋转光标并找到它.我想知道代码中发生了什么.特别是for c in spinning_cursor():我从未见过这种语法.是因为我一次从生成器返回一个元素yield,并将其分配给c?在y()中使用x的任何其他例子?
import sys
import time
def spinning_cursor():
cursor='/-\|'
i = 0
while 1:
yield cursor[i]
i = (i + 1) % len(cursor)
for c in spinning_cursor():
sys.stdout.write(c)
sys.stdout.flush()
time.sleep(0.1)
sys.stdout.write('\b')
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 48
使用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)
'|'
Run Code Online (Sandbox Code Playgroud)
这个特定的生成器永远不会返回,因此StopIteration永远不会被提升,并且for循环将永远继续,除非你杀死脚本.