【问题标题】:Difference between two yield statements两个 yield 语句之间的区别
【发布时间】:2020-06-12 02:37:41
【问题描述】:

以下两个生成器函数有什么区别?

def get_primes(number):
    while True:
        if is_prime(number):
            number = yield number
        number += 1

还有:

def get_primes(number):
    while True:
        if is_prime(number):
            yield number
        number += 1

据我所知,我可以称它们为:

p = get_primes(0)

# first call works for both
next(p) # or p.send(None)

# second call different for both
next(p)    # works for second way only
p.send(14) # works for first way only

我认为我的问题是我不太了解 send 的工作原理以及它如何设置值等等。

【问题讨论】:

  • 第一个允许您为number 设置一个新值send,如果不这样做,则失败。如果您在不发送值的情况下调用 next,则 number 将是 None,然后 number += 1 会引发 TypeError。
  • @kaya3:虽然它可以通过接受不同的名称来相当容易地工作,并且只有在发送的值不是None时才将其移动到number

标签: python python-3.x generator yield


【解决方案1】:

如果您查看docs,它会显示:

恢复执行并将一个值“发送”到生成器函数中。 value 参数成为当前 yield 表达式的结果。

这听起来可能有点神秘,所以换句话说:

使用send(),生成器从它产生的地方恢复,您发送的值是yield 返回的值(并且可以分配给任何变量)。你也可以试试下面的代码:

def get_num():
    number = 1
    while True:
        print(number)
        number = yield number

g = get_num()
g.send(None)  # haven't yielded yet, cannot send a value to it
g.send(2)
g.send(5)

它会返回:

  • 1:我们最初分配给 number 的值
  • 2:我们做了send(2),这就是number = yield ...分配给number的内容,然后我们继续,循环回到print()并再次屈服。
  • 5:同样的事情,但我们做了send(5)

【讨论】:

  • 酷,还可以通过g.gi_frame.f_locals 来检查它存储的内容。
  • 另外——澄清一下,它首先返回yield语句,之后将值从send赋值给number,对吗?
  • 是的,它在那里产生并暂停。使用send() ,生成器恢复,yield 返回(在生成器内部)发送的值并继续执行,直到它再次生成(或结束)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 2021-12-21
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多