python - o que yield (yield) faz?

Desde o python 2.5, há a capacidade desend(), throw(), close() em um gerador. Dentro do gerador definido, é possível 'capturar' os dados enviados, fazendo algo como:

def gen():
    while True:
        x = (yield)
        if x == 3:
            print('received 3!!')
            break
        else:
            yield x

O que estou tentando brincar é fazer algo como:

def gen2():
    while True:
        yield (yield)

Percebeu que é um gerador legal que faz alguma coisa. A primeira coisa que estou tentando descobrir é:

Existe um bom uso para essa escrita?

Além disso, ao fazer algo como:

g = gen2()
next(g)
g.send(10) # output: 10
g.send(2) # output: nothing
g.send(3) # output: 3
g.send(44) # output: nothing

Por que cada segundo 'enviar' não faz nada?

questionAnswers(2)

yourAnswerToTheQuestion