【问题标题】:Why does this generator work with a for loop but not with next()?为什么这个生成器可以与 for 循环一起工作,但不能与 next() 一起工作?
【发布时间】:2020-03-12 03:12:07
【问题描述】:

我正在尝试制作一个生成器,它可以为我提供 3 个数字的排列

def generador():
    for i in range(3):
        for j in range(3):
            for k in range(3):
                yield i,j,k

使用 for 循环 for a,b,c in generador(): 可以正常工作,但是:

for _ in range(27):
    print(next(generador()))

只是一遍一遍地打印(0,0,0)。为什么?

【问题讨论】:

  • 标准库中有一个函数可以帮你搞定,顺便list(itertools.product(range(3), range(3), range(3)))
  • 您收到此错误是因为generator() 创建了生成器。所以你正在创建生成器并获得它的第一个项目 27 次。正确的方法是创建一次 my_gen = generator() 然后你可以调用 next for _ in range(27): print(next(my_gen))

标签: python-3.x generator yield next


【解决方案1】:

您需要将生成器锁定到一个变量,并通过它next,这样您将通过同一个实例,否则您将在每个循环中通过一个新实例,因此您得到 0,0,0

def generador():
    for i in range(3):
        for j in range(3):
            for k in range(3):
                yield i,j,k
a = generador()
for _ in range(27):
    print(next(a))

【讨论】:

    【解决方案2】:

    就像已经说过的那样,您每次迭代都在创建生成器。您需要在每次迭代时对其进行迭代:

    gen = generador()
    for _ in range(27):
        print(next(gen))
    

    虽然itertools.product 会为你做这件事:

    def generador():
        yield from itertools.product(range(3), repeat=3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2021-04-29
      • 2015-03-16
      • 1970-01-01
      • 2016-02-06
      • 2012-12-16
      • 1970-01-01
      相关资源
      最近更新 更多