两个 yield 语句之间的区别

Difference between two yield statements

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

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 的工作原理以及它如何设置值和所有内容。

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

Resumes the execution and “sends” a value into the generator function. The value argument becomes the result of the current yield expression.

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

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

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)

会return:

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