擅长:python、mysql、java
<p>问题是您的原始代码以一种不寻常的方式使用<code>return</code>。在</p>
<pre><code>def combination(K, L):
if K<=0:
yield []
return # < - hmmm
</code></pre>
<p>大多数情况下,您不会在生成器中看到<code>return</code>,因为您不经常需要它。通常,生成器只是在末尾“掉下来”;解释器到达生成器的末尾时没有遇到<code>return</code>语句,然后它知道抛出<code>StopIteration</code>。在</p>
<p>在<em>这个</em>案例中,代码的编写者插入了一个<code>return</code>语句来“加快”进程。当<code>K <= 0</code>时,没有更多的工作要做,因此生成器可以抛出<code>StopIteration</code>,但是如果没有<code>return</code>语句,它将进入<code>for</code>循环,产生错误的结果。在我看来,更清楚的方法应该是:</p>
^{pr2}$
<p>现在转换按预期工作:</p>
<pre><code>def combination2(K, L):
result = []
if K <= 0:
result.append([])
else:
for i in range(len(L)):
thisone = L[i:i + 1]
for another in combination2(K - 1, L[i + 1:]):
result.append(thisone + another)
return result
</code></pre>