为什么这个递归的`yield from`函数不会引发错误?

时间:2020-04-19 16:07:38

标签: python recursion yield yield-from

def prefixes(s):
    if s:
        yield from prefixes(s[:-1])
        yield s

t = prefixes('both')
next(t)

next(t)返回'b'。我只是对为什么这感到困惑,因为如果我们遵循yield from语句,我们最终将以yield from prefixes('')结束,它将返回None。在所有其他测试中,从None产生的结果会引发TypeError。相反,这似乎只是被忽略了,并且prefixes('b')移至下一个yield语句(?为什么这样做?)以产生'b'... 有什么想法吗?非常感谢您的解释。

2 个答案:

答案 0 :(得分:0)

生成器是惰性(按需)对象,您没有耗尽生成器t,要耗尽您的生成器,您可以使用:

list(t)
# ['b', 'bo', 'bot', 'both']

现在,如果您使用next(t),您将获得预期的StopIteration

StopIteration                             Traceback (most recent call last)
<ipython-input-25-680ef78477e2> in <module>
      6 t = prefixes('both')
      7 list(t)
----> 8 next(t)

StopIteration: 

if声明“保证”您已经结束,并且您永远不会None[:-1]来获得TypeError

答案 1 :(得分:0)

prefixes包装在一个生成器中,当函数返回时,生成器将引发StopIteration。传递空字符串时,prefixes将跳过所有收益,到达其代码块的末尾并返回,从而导致StopIteration。返回值无关紧要,它将被丢弃

>>> next(prefixes(""))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

yield from抑制内部生成器的StopIteration并让外部生成器继续。