【问题标题】:Getting error while calling generator in Python在 Python 中调用生成器时出错
【发布时间】:2020-07-08 12:47:24
【问题描述】:

我创建了一个简单的生成器:

def long_time():

    for i in range(10):

        yield i * 5  

a = long_time()

print(next(a))

print(next(a))

在这里,我得到了输出 0 和 5,这没关系。但是当我尝试如下构建变量时:

def long_time():

    for i in range(10):
        yield i * 5
  
a = long_time

print(next(a()))

print(next(a()))

两个打印输出都是0。有什么区别,我应该总是用()调用生成器吗?

【问题讨论】:

    标签: python generator yield


    【解决方案1】:

    当你写作时

    a = long_time 
    

    你只是给函数 long_time 取了一个不同的名字。

    这么写

    print(next(a()))
    

    和写一样

    print(next(long_time()))
    

    也就是说,在一行中,通过调用long_time() 得到一个生成器对象,然后将其传递给next,得到生成器的第一个值0。但是由于您没有对该生成器的引用,因此在该行之后您将无法再访问该对象。在您的下一个 print... 行中,您将获得一个新的生成器,因为它涉及对 long_time() 的新调用。

    a 不是对long_time 函数的引用,而是它的返回值(生成器)时,此问题已得到解决:

    a = long_time()
    

    【讨论】:

    • 因此,即使我说 a = long_time(),next(a) 仍然是不同于 next(long_time()) 的其他东西(返回值)。虽然有点混乱......
    • 返回的值是一样的,不同的是你有没有引用它(即存储在一个变量中),所以你以后可以访问它。这就像写[1, 2, 3][0]mylist = [1, 2, 3]; mylist[0]:在这两种情况下,您都会获得列表的第一个元素,但在第一个示例中,您随后无法访问该列表,因为您创建了它并在单个中提取了它的第一个元素线。 next_long_time()) 是前者,a = long_time(); next(a) 是后者。
    • 非常感谢您的详细描述。
    【解决方案2】:

    当你调用long_time 时,你会得到一个新的生成器对象。在您的第二个示例中,a 只是生成器函数 的另一个名称,因此每次调用a(),您都会得到一个新生成器(就像您调用了long_time)从 0 开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      相关资源
      最近更新 更多