【问题标题】:Why does my generator function always return the same value?为什么我的生成器函数总是返回相同的值?
【发布时间】:2014-05-24 17:18:55
【问题描述】:

我想为伯努利三角形构建一个生成器,三角形中j 行中的数字ij 行中帕斯卡三角形中第一个i 数字的部分和。

三角形看起来像这样:

这将在 python 中由列表表示:

[[1], [1,2], [1,3,4], [1,4,7,8] 

我的生成器函数返回[1]作为第一个输出,这是正确的,但它总是返回[]

这是我的代码:

def next_row(row):
    n = len(row)
    new_row = [row[0]] + [row[i] + row[i+1] for i in range(n - 1)] + [row[-1]]
    return new_row


def generate_pascal():
    row =[1]
    while True:
        yield row
        row=next_row(row)


def generate_bernoulli():

    row=next(generate_pascal())
    n=len(row)
    while True:
        yield row
        row=[row[0]+sum(row[0:i]) for i in range(n-1)]

【问题讨论】:

  • 你说的一直是什么意思,你到底想要什么?
  • 你永远不会在generate_bernoulli 中更新n
  • 您也只调用一次generate_pascal。你想达到什么目的?
  • pascal 标签用于 Pascal 语言,而不是 Pascal 的三角形。使用前请阅读标签摘录。

标签: python list generator pascals-triangle


【解决方案1】:

首先,您只调用了一次next,而不是每次迭代都调用它。其次,您从未在每次迭代中更新行。此外,您的部分金额和yield 互换了。我通过在 while 循环内调用 next 并在其外部初始化 pascal 生成器来修复这些问题。最后,你的总和有点少;我也解决了这个问题。正确的代码如下:

def generate_bernoulli():
    pascal = generate_pascal()
    while True:
        row=next(pascal)
        n=len(row)
        row=[sum(row[0:i+1]) for i in range(n)]
        yield row

【讨论】:

    【解决方案2】:

    您需要计算帕斯卡三角形各行的部分和。下面是我编写代码的方式。

    def partial_sums(xs):
        s = 0
        for x in xs:
            s += x
            yield s
    
    def generate_bernoulli():
        for row in generate_pascal():
            yield list(partial_sums(row))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-06
      • 2010-12-22
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      相关资源
      最近更新 更多