for y in y():这是如何工作的?

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循环将永远继续,除非你杀死脚本.

  • Waaaay太快了. (6认同)

aym*_*met 5

在Python中,for语句允许您迭代元素.

根据文件:

Python的for语句按照它们出现在序列中的顺序迭代任何序列(列表或字符串)的项目

这里,元素将是返回值spinning_cursor().