以下两个生成器函数之间有什么区别?
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,它会说:
恢复执行并将值“发送”到生成器函数。 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)
。