码迷,mamicode.com
首页 > 编程语言 > 详细

python 生成器 send

时间:2018-04-20 00:07:53      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:需要   生成   art   font   nbsp   bsp   tor   ber   value   

 

#!/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))

运行,

[penx@ali01 python]$ ./gen_send.py 
1
3
[penx@ali01 python

结果, 
正常运行。

python 生成器 send

标签:需要   生成   art   font   nbsp   bsp   tor   ber   value   

原文地址:https://www.cnblogs.com/lixufeng/p/8886295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!