【问题标题】:Are there already python generators that do these basic things?是否已经有 python 生成器可以做这些基本的事情?
【发布时间】:2011-08-18 23:38:36
【问题描述】:

我发现自己在使用这 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 ...

谢谢大家!

【问题讨论】:

    标签: python iterator generator


    【解决方案1】:

    第一个是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
    

    【讨论】:

    • 哎呀!我知道链,但不知道 from_iterable。谢谢agf
    • 我只是经常玩数学序列。在数学中(正如您可能已经知道的那样),将相同的函数一遍又一遍地应用于一个值的术语是,令人困惑的是,“迭代”。很高兴有一种简洁、通用、惰性求值的方式来执行这些迭代序列。
    • 现在我很好奇——为什么overnover 似乎适合监控?
    • 好吧,如果你有一个迭代函数,并且你不知道需要多少步才能到达你需要的地方,那么查看中间值以知道何时停止是什么我的意思是监控。此外,如果函数实际上是由副作用操作的,这将是它通过侧通道报告进度的一种方式。
    • 您也可以使用send 将信息发送到生成器,因此它可以默认扩展为使用它的最后一个产量作为输入,但也可以采用新值,如果对于某些原因它需要调整或跳过一个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2023-03-15
    • 1970-01-01
    • 2017-02-09
    • 2013-07-15
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多