Как я могу передать оператор yield генератор другой функции. -Python

Я читал на этом сайте и не могу найти конкретный ответ, который я хочу. Я пытался прочитать слайды Дэвида Бисли об итерации и генераторах, но до сих пор не могу получить ответ, который ищу, хотя вопрос кажется простым. Я запускаю симуляцию на основе часов (Брайан для нейронных сетей), и у меня есть генератор, который манипулирует выходами и добавляет их к промежуточной сумме (для того, чтобы для простого фильтра нижних частот было n экспоненциального затухания), Затем я хочу получить выходные данные этих генераторов на каждом временном шаге, а затем использовать их в другой функции для обновления некоторых переменных состояния. В нем говорится, что, поскольку элемент имеет тип генератора, я не могу этого сделать. код и объяснение кода выглядит следующим образом:

import numpy
our_range=numpy.arange(0*ms,duration+defaultclock.dt,defaultclock.dt)
a=our_range   
c=defaultclock.t   #this is a clock that is part of the program i'm running, it updates every #timestep and runs through the range given above

def sum_tau(neuron):            #this gives a running sum which i want to access (the alphas can be ignored as they are problem specific)
    for c in a:            #had to express it like this (with c and a) or it wouldn't run
        if c ==0:
            x=0
        elif defaultclock.still_running()==False:
            return
        else:
            x = x*(1-alpha) + p(neuron)*alpha
            print x
            yield x


#p(neuron) just takes some of the neurons variables and gives a number

b=sum_tau(DN)     #this is just to specify the neuron we're working on, problem specific

@network_operation
def x():
    b.next()

@network_operation означает, что на каждом такте будет выполняться нижеприведенная функция, поэтому обновляется сумма до требуемого значения. Теперь я хочу обновить значение, используемое для симуляции (где d - это вывод в другой генератор, не показан, но очень похож на b), набрав:

ron= (d/(1-b))

Тем не менее, он говорит, что я не могу использовать объект-генератор таким образом, я использовал операторы print, чтобы определить, что b (и d) дают выходные данные, которые я хочу получить на каждом временном шаге (когда выполняется симуляция), но я не могу получить эти выходные данные и делать что-нибудь с ними. (точнее, неподдерживаемый тип операнда '-' для int и generator. Я попытался преобразовать его в число с помощью float(), но, очевидно, это не работает по той же причине, я чувствую, что должно быть очень простое решение моей проблемы, но Я не могу найти это. Спасибо заранее.

1 ответ

Решение

"более конкретно, неподдерживаемый тип операнда" - "для int и генератора".

Вы не можете использовать генератор в тривиальной формуле. Вы должны "расширить" его с помощью выражения генератора.

ron= (d/(1-b))

Имеет генератор b, право? b это не "ценность". Это какая-то последовательность значений.

Таким образом, вы должны применить каждое значение в последовательности к вашей формуле.

ron = [ d/(1-x) for x in b ]

получит каждое значение последовательности и вычислит новое значение.

(Не ясно, если это действительно полезно, так как оригинал ron= (d/(1-b)) когда b это коллекция значений не имеет особого смысла.)

Другие вопросы по тегам