我们先看一下下面这个generator,它不会被send函数所影响。它在初始化时接受数字参数,并且不被send所影响:
>>> def double_number(number):
... while True:
... number *=2
... yield number
...
>>> c = double_number(4)
>>> c.send(None)
8
>>> c.next()
16
>>> c.next()
32
>>> c.send(8)
64
>>> c.send(8)
128
>>> c.send(8)
256
现在,下面展示你如何在相同的函数类型下使用send,使得在每一次迭代中你可以改变参数的值:
def double_number(number):
while True:
number *= 2
number = yield number
从下面的结果你可以看到,send一个新的值改变了结果:
>>> def double_number(number):
... while True:
... number *= 2
... number = yield number
...
>>> c = double_number(4)
>>>
>>> c.send(None)
8
>>> c.send(5) #10
10
>>> c.send(1500) #3000
3000
>>> c.send(3) #6
6
本文翻译自
Stackoverflow的一篇帖子
在做所有事之前send None的目的在于:It is done to 'start' the generator. It is just something that needs to be done. It makes some sense when you think about it since the first time you call send() the generator has not reached the keyword yield yet.