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
循环将永远继续,除非你杀死脚本.
归档时间: |
|
查看次数: |
5711 次 |
最近记录: |