您可以将其作为第一次send
调用的当前未使用的返回值返回。
def genFn(a, b, c):
# some initialisation / pre-computation
startPt = fn(a, b, c)
data = (yield startPt)
while True:
# perform some computation
data = (yield result)
f = genFn(5, 6, 7)
startPt = f.send(None) # first yield returns the start point
for data in dataseries[startPt:]:
k = f.send(data)
顺便说一句,.send(None)
与 相同.next()
。
或者您可以使用一个类并将生成器用作其方法之一。预计算将在其中完成,__init__
并且可以通过实例属性访问数据。
class GenCl(object):
def __init__(self, a, b, c):
self.startPt = fn(a, b, c)
def gen(self):
startPt = self.startPt # get the startPt calculated in __init__
data = (yield None)
while True:
# perform some computation
data = (yield result)
o = genCl(5, 6, 7)
startPt = o.startPt
f = o.gen() # create the generator object
f.send(None)
for data in dataseries[startPt:]:
k = f.send(data)
还有一个想法是使用闭包。函数调用将返回生成器和起点,例如在元组中。
def genFn(a, b, c):
# some initialisation / pre-computation
startPt = fn(a, b, c)
def gen(): # actual generator function
data = (yield None)
while True:
# perform some computation
data = (yield result)
return gen(), startPt # returns generator and startPt
f, startPt = genFn(5, 6, 7)
f.send(None)
for data in dataseries[startPt:]:
k = f.send(data)