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

这个问题在这里已经有了答案:

  • “yield”关键字有什么作用? 36个答案

  • 使用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?