如何将生成器yield语句传递给另一个函数。 -蟒蛇

时间:2011-09-27 02:17:33

标签: python generator yield

我一直在这个网站上阅读,似乎无法找到我想要的具体答案。我已经尝试在迭代和生成器上阅读大卫beasly的幻灯片,但仍然无法得到我正在寻找的答案虽然这个问题看起来很简单。我正在运行一个基于时钟的模拟(Brian用于神经网络),我有一个生成器正在操作输出并将它们添加到运行总和(为了简单的低通滤波器有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 个答案:

答案 0 :(得分:2)

“更具体地说,不支持的操作数类型' - '用于int和生成器”接受提示。

你不能在一个简单的公式中使用生成器。你必须用生成器表达式“扩展”它。

ron= (d/(1-b))

有一个生成器b,对吗? b不是“价值”。它是某种价值序列。

因此,您必须将序列中的每个值应用于公式。

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

将获取序列的每个值并计算新值。

(目前尚不清楚这是否真的有用,因为当ron= (d/(1-b))是值的集合时原始的b没有多大意义。)

相关问题