2016-09-27 2 views
0

Я знаю, что вы можете использовать .send(value) для отправки значений генератору. Я также знаю, что вы можете перебирать генератор в цикле for. Можно ли передавать значения генератору, итерации по нему в цикле for?Как передать значения генератору в цикл for?

То, что я пытаюсь сделать, это

def example(): 
    previous = yield 
    for i range(0,10): 
     previous = yield previous*i 

t = example() 
for value in example"...pass in a value?...": 
    "...do something with the result..." 
+0

вы пробовали это то, что был результатом ... вы не можете отправить значение в оператор 'for'. Но вы можете использовать 'while'. – AChampion

+0

Если я использую цикл while, мне нужно поймать 'StopIteration', который добавляет много шаблонов. – mklauber

+1

И вы чувствуете, что вложенный генератор является более понятным кодом? – AChampion

ответ

0

Хорошо, так что я понял это. Хитрость заключается в создании дополнительного генератора, который обертывает t.send(value) в цикле for (t.send(value) for value in [...]).

def example(): 
    previous = yield 
    for i in range(0,10): 
     previous = yield previous * i 

t = examplr() 
t.send(None) 
for i in (t.send(i) for i in ["list of objects to pass in"]): 
    print i 
+1

Очевидно, что некоторые вырезали ошибки пасты здесь 'test()' не определено, и у вас есть дополнительный ')' в 'for'. – AChampion

+0

@AChampion: и даже если эти проблемы исправлены, он ничего не производит – Gerrat

+0

Измените '[" list ... "]' на разумный список, и он должен. – AChampion

1

Вы технически могли бы, но результаты были бы запутанными. например:

def example(): 
    previous = (yield) 
    for i in range(1,10): 
     received = (yield previous) 
     if received is not None: 
      previous = received*i 


t = example() 
for i, value in enumerate(t): 
    t.send(i) 
    print value 

Выходы:

None 
0 
2 
8 
18 

Дэйв Бизли написал amazing article сопрограмм (tldr, не следует смешивать генераторы и сопрограмм в одной и той же функции)

Смежные вопросы