#!/usr/bin/python3
def MyGenerator():
value=yield 1
yield value
return done
gen=MyGenerator()
print(next(gen))
print(gen.send("I am Value"))
生成器内有一个方法send,可再次传入一个值。
上面那句可能听不懂,但是不要紧,我们先来看看代码,
#!/usr/bin/python3
def MyGenerator():
value=yield 1
yield value
return done
gen=MyGenerator()
print(next(gen))
print(gen.send("I am Value"))
代码分析,
在MyGenerator
里,我们一共用了两次yield
。
比较奇怪的是第一个yield
的语句,value=yield 1
。如果没看过这一语句的,肯定不知道next
回到yield
后,其实是有一个值的。
到这,我们先不急,运行结果,
[penx@ali01 python]$ ./gen_send.py
1
I am Value
[penx@ali01 python]$
运行过程,
用next
启动了生成器gen
,知道到yield 1
时返回1。
然后我们再用gen
的内部方法send
进入gen
,而且还带回来一个值“I am Value
”。这时候,继续执行yield 1
后的代码“value=
”,把带回来的值“I am Value
”赋给value
。直到遇到yield value
,把value
返回。
其实,send和next的执行很像,只是send可以和生成器互动,传入一个值。
生成器的启动需要next
大家有没有想过,如果生成器还没启动过,就用send,会怎样?我们来试一下。
代码,
#!/usr/bin/python3
def MyGenerator():
value=yield 1
yield value
return done
gen=MyGenerator()
print(gen.send(3))
运行,
[penx@ali01 python]$ ./gen_send.py
Traceback (most recent call last):
File "./test.py", line 9, in <module>
print(gen.send(3))
TypeError: can't send non-None value to a just-started generator
[penx@ali01 python]$
结果,
报错,
> TypeError: can’t send non-None value to a just-started generator
说生成器刚启动时,不能send
一个不为None
的值。
小结,
所以呢,我们在用生成器时,第一次要用next
启动
生成器启动可用send(None)
其实上面报错已经说了,can’t send non-None value
所以啊,我们可以用send(None)
来启动生成器。
代码,
#!/usr/bin/python3
def MyGenerator():
value=yield 1
yield value
return done
gen=MyGenerator()
print(gen.send(None))
print(gen.send(3))`</pre>
运行,
[penx@ali01 python]$ ./gen_send.py
1
3
[penx@ali01 python]$
结果,
正常运行。