<p>无限递归发生在字符串的情况下,因为它是<strong>iterable</strong>。你知道吗</p>
<p>您的函数依赖TypeError来中断递归,因此下面是代码通常的处理方式:</p>
<pre><code>> flatten([[1,2],[3,4]]) -function call
> for e in ([[1,2],[3,4]]) -outer loop
> for i in flatten([1,2]) -inner loop
> for e in ([1,2]) -recursion outer loop
> for i in flatten(1) -recursion inner loop
> for e in 1 [TYPE_ERROR] -recursion2 outer loop
> yield 1 -recursion2 except call
> etc...
</code></pre>
<p>如您所见,当程序尝试对整数(<code>1</code>)进行迭代时,会发生类型错误,将函数从递归中中断。但是,这不会发生在字符串中:</p>
<pre><code>> flatten([["hi","hello"],[3,4]]) -function call
> for e in ([["hi","hello"],[3,4]]) -outer loop
> for i in flatten(["hi","hello"]) -inner loop
> for e in (["hi","hello"]) -recursion outer loop
> for i in flatten("hi") -recursion inner loop
> for e in "hi" -recursion2 outer loop
> for i in flatten("h") -recursion2 inner loop
> for e in "h" -recursion3 outer loop
> for i in flatten("h") -recursion3 inner loop
> and so on forever
</code></pre>
<p>因为python仍然会对单个字符串进行迭代,并且函数依赖类型异常来停止递归,所以函数将无限期地运行(直到达到最大递归深度,并且程序至少会崩溃)。你知道吗</p>
<p>因此,如果要将此函数用于字符串,只需设置一个条件来检查函数是否在字符串上迭代:</p>
<pre><code>def flatten(nested):
try:
if isinstance(nested, str):
yield nested
else:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
</code></pre>
<p>通过添加if语句,您应该能够使用字符串:</p>
<pre><code>mylist = [["hi","hello"],[3,4]]
for e in flatten(mylist):
print(e)
-Output -
hi
hello
3
4
</code></pre>