<p>由于生成器表达式不能有自己的作用域,因此最好的方法是按照您的建议定义生成器函数。在</p>
<pre><code>def yld123u(u):
for i in range(1, 4):
yield i * u
</code></pre>
<p>如果您需要在这个过程中更新<code>u</code>,并且这是您希望避免上述情况的原因,那么就知道您可以<a href="https://stackoverflow.com/q/19302530/5079316">^{<cd2>}</a>将值赋给生成器。在</p>
^{pr2}$
<h2>示例</h2>
<p>如果不使用send,生成器的行为仍然相同。在</p>
<pre><code>for x in yld123u(4):
print(x)
</code></pre>
<h3>输出</h3>
<pre><code>4
8
12
</code></pre>
<p>您可以使用<code>send</code>来更新<code>u</code>的值。在</p>
<pre><code>gen = yld123u(4)
v0 = next(gen)
v1 = gen.send(0)
v2 = gen.send(4)
print(v0, v1, v2)
</code></pre>
<h3>输出</h3>
<pre><code>4 0 12
</code></pre>
<h2>输入回路</h2>
<p>如果您需要生成器与用户输入进行交互,下面是我以前的回答,它建议了一种实现<a href="https://stackoverflow.com/a/50918359/5079316">yield-receive generator usable in a for-loop</a>的方法。在</p>
<pre><code>class YieldReceive:
stop_iteration = object()
def __init__(self, gen):
self.gen = gen
self.next = next(gen, self.stop_iteration)
def __iter__(self):
return self
def __next__(self):
if self.next is self.stop_iteration:
raise StopIteration
else:
return self.next
def send(self, value):
try:
self.next = self.gen.send(value)
except StopIteration:
self.next = self.stop_iteration
</code></pre>
<h3>用法</h3>
<pre><code>it = YieldReceive(yld123u(4))
for x in it:
print(x)
it.send(int(input('Enter next u value: ')))
</code></pre>