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'...
有什么想法吗?非常感谢您的解释。
答案 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
并让外部生成器继续。