<p>让我们更仔细地追踪一下行动:</p>
<pre><code>def monG(borneinf,bornesup):
while True:
if bornesup < borneinf:
bornesup, borneinf = borneinf, bornesup
borneinf += 1
if borneinf==bornesup:
break
print("TRACE", borneinf, bornesup)
x=(yield borneinf)
if x is not None:
borneinf = x
c = monG(2,10)
print(type(c))
for a in c:
if a==5:
print(c.send(20), "a==5")
print(a)
</code></pre>
<p>这给我们在<code>c.send</code>行上提供了一个特殊的标记,以及在<code>yield</code>行之前的一个预览</p>
<p>输出:</p>
<pre><code><class 'generator'>
TRACE 3 10
3
TRACE 4 10
4
TRACE 5 10
TRACE 11 20
11 a==5
5
TRACE 12 20
12
TRACE 13 20
13
TRACE 14 20
14
TRACE 15 20
15
TRACE 16 20
16
TRACE 17 20
17
TRACE 18 20
18
TRACE 19 20
19
</code></pre>
<p>正如<code>MisterMiyagi</code>所指出的,<code>yield</code><em>确实返回11,但是您将它扔掉了。也许您想将该值赋给<code>a</code>,尽管混用循环参数是一种明确的代码味道。如果你做了这个赋值,你就在迭代中打印出<code>11</code>,而不是<code>5</code>。你知道吗</p>
<p>我认为您的基本问题是您干扰了您的迭代流,在循环中强制了一个额外的<code>yield</code>。在您编码的循环中,隐式的<code>yield</code>意味着您在连续的迭代中不能同时得到<em></em><code>5</code>和<code>11</code>。你知道吗</p>