Вот простой пример использования send
для переключения генератора между двумя различными режимами итерации: он либо увеличивает свое текущее значение, либо умножает его. Тот же принцип может быть применен к вашей задаче обхода графа.
Метод send
позволяет отправить объект в генератор. Досадно, что результат send
- это текущее значение, которое вы получили бы, вызвав next
; было бы неплохо, если бы вы могли отправить, не имея генератора, выдающего значение, но это просто то, с чем мы должны жить.
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))
выход
1
2
3
4
5
10
20
40
80
160
161
162
163
164
165
Если у вас возникли проблемы с применением этого метода к задаче обхода графа, задайте новый вопрос (возможно, со ссылкой на этот), который включает в себя некоторый соответствующий код графа, чтобы ответчикам не приходилось писать этот материал с нуля, чтобы протестируйте и продемонстрируйте их код.