<p>下面是一个使用<code>send</code>在两种不同的迭代模式之间切换生成器的简单示例:它要么增加当前值,要么将当前值相乘。同样的原理也可以应用于图形遍历任务。你知道吗</p>
<p><code>send</code>方法允许您将对象发送到生成器中。恼人的是,<code>send</code>的结果是通过调用<code>next</code>可以获得的当前值;如果您可以发送而不让生成器生成一个值,那会很好,但这正是我们必须面对的问题。你知道吗</p>
<pre><code>def add_or_mul(current, step, scale, mode='add'):
''' A generator that either adds step to the current value,
or multiplies it by scale
'''
while True:
newmode = yield current
if newmode is not None:
if newmode not in ('add', 'mul'):
raise ValueError('Bad mode: ' + newmode)
mode = newmode
if mode == 'add':
current += step
else:
current *= scale
# Test
gen = add_or_mul(1, 1, 2)
for i in range(5):
print(next(gen))
print(gen.send('mul'))
for i in range(4):
print(next(gen))
print(gen.send('add'))
for i in range(4):
print(next(gen))
</code></pre>
<p><strong>输出</strong></p>
<pre><code> 1
2
3
4
5
10
20
40
80
160
161
162
163
164
165
</code></pre>
<hr/>
<p>如果您在将此技术应用于图形遍历任务时遇到问题,请提出一个新问题(可能链接到此问题),其中包括一些相关的图形代码,这样回答者就不必从头开始编写这些内容来测试和演示他们的代码。你知道吗</p>