我发现自己在使用这 2 个自定义生成器,并认为“必须有一个 itertools 函数或已经这样做的东西!但没有找到任何东西。我错过了什么吗?谢谢!

def gothru(iters):
  for i in iters:
    for j in i:
      yield j

def overnover(fn,startval):
  val = startval
  while True:
    val = fn(val)
    yield val

编辑:我后来想象如何使用 overnover 来生成斐波那契数列,我意识到需要对其进行泛化以允许函数具有多个参数
def overnover(fn,*args):
  while True:
    args = fn(*args)
    return args

那么你可以这样做:
fibInfo = overnover(lambda x,y: (x+y, x), 1, 1)

-> (2,1) ... (3, 2) ... (5, 3) ... (8, 5) ...
然后:
fib = imap(lambda x:x[0], fibInfo)

-> 2 ... 3 ... 5 ... 8 ...

谢谢你们!

最佳答案

第一个是 chain.from_iterable

最接近 overnover 的是类似 tabulate 的东西:

def tabulate(function, start=0):
    "Return function(0), function(1), ..."
    return imap(function, count(start))

这是您的函数的特殊情况,它输出序列号。 count 也需要一个 step ,因此您可以将其概括为
def tabulate(function, start=0, step=1):
    "Return function(0), function(0+step), ..."
    return imap(function, count(start, step))

这是 overnover 的一个版本,可以让您将值发送到序列中:
def overnover(fn, val):
    while True:
        val = fn(val)
        val = (yield val) or val

关于python - 是否已经有 python 生成器可以做这些基本的事情?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7115428/

10-11 22:23
查看更多