【问题标题】:Generator issue in PythonPython中的生成器问题
【发布时间】:2017-07-14 12:22:09
【问题描述】:

我试图理解 Python 中的生成器并实现了这个:

def yfun():
    print("into y fun ... ")
    for x in range(1,6):
        print("tryin to yield : {}".format(x))
        yield x

yieldVar = yfun()

for val in yieldVar:
   print("value generated -> ", val)

输出如下:

into y fun ...
tryin to yield : 1
value generated ->  1
tryin to yield : 2
value generated ->  2
tryin to yield : 3
value generated ->  3
tryin to yield : 4
value generated ->  4
tryin to yield : 5
value generated ->  5

你能解释一下为什么这个函数被一次又一次地调用吗?变量不应该具有值并且应该在生成器变量上进行迭代吗?

【问题讨论】:

  • 当您调用该函数时,它会为您提供一个生成器对象。遍历该对象会执行您的 yfun 定义中产生值的代码。
  • 看看docs
  • 是什么让你觉得函数被一次又一次地调用?毕竟into y fun 只打印一次。
  • 是的,这正是我们试图理解的内容,但是生成输出的方式“试图产生”和“产生的价值”它们一定不能相互干扰

标签: python python-3.x generator


【解决方案1】:

该函数被一次又一次地调用,您可以看到"into y fun ..." 只被打印一次

正在发生的事情是生成器,您通过调用包含yield 的函数获得,正在被 for 循环推进(即消耗)。

yieldVar = yfun()  # call yfun and get a generator

当生成器继续产生值时,循环运行并打印您产生的元素。

【讨论】:

  • 感谢您的回复,但现在我无法理解为什么没有立即创建生成器对象并将其分配给“yieldVar”?我想说的是,不应该像..当我从函数 yfun() 分配 yieldVar 值时,应该创建一个生成器并将其分配给 yieldVar,因此当我使用第二个 for 迭代生成器时我已经写了将输出作为生成的值 -> 1 \n 生成的值 -> 2 ........
【解决方案2】:

当您调用生成器函数时,会返回一个生成器对象。不是像普通函数那样的单一值。这是一个可用于惰性求值的对象。每个生成器对象都有一个名为__next__() 的方法。这允许 Python 通过调用 __next__() 多次从 generator 对象——而不是函数——yieldVar 产生一个值。

【讨论】:

  • 所以这意味着当我迭代变量时,“yieldVar = yfun()”行正在被懒惰地评估并且在它到达那个点之前不做任何操作??
  • @SirTesla 完全正确。
  • @SirTesla 很高兴为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
相关资源
最近更新 更多