Python 生成器: yield 和 yield from

3

我有如下代码:

def foo(word, i):
    if i >= len(word):
        return

    yield from foo(word, i+1)
    yield word[i]

for j in foo("intro", 0): print(j, end = "")

这段代码打印了ortni。编译器调试无法帮助我,也不确定它是如何工作的。我尝试阅读关于yield fromyield的说明,但是不理解它们在这个示例中的作用。

以上代码如何打印出反向的字符"ortni"?它是如何工作的?


6
yield from x 相当于 for item in x: yield item - 这个解释有帮助吗? - alani
本质上,该函数的作用是:倒序打印 intro,先倒序打印 ntro,然后再打印 i。为了倒序打印 ntro,先倒序打印 tro,然后再打印 n。以此类推... - alani
1个回答

6

每次调用foo都会创建一个迭代器,该迭代器:

  1. 产生递归调用生成的所有值
  2. 由word[i]指定的一个值
Value of i           Number of values yielded
    len(word)                 0
    len(word) - 1             1
    len(word) - 2             2
       ...                    ...
         i                 len(word) -i
       ...                    ...
       0                   len(word)

由于递归调用首先执行,因此使用 word.__getitem__ 检索值时,生成的值的顺序与它们被检索的顺序相反。

foo("intro", 0)
yield from foo("intro", 1)
           yield from foo("intro", 2)
                      yield from foo("intro", 3)
                                 yield from foo("intro", 4)
                                            yield from foo("intro", 5)
                                                       return
                                            yield "intro"[4]  # "o"
                                 yield "intro"[3]  # "r"
                      yield "intro"[2]  # "t"
           yield "intro"[1]  # "n"
yield "intro"[0]  # "i"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接