send python_python 生成器 send()方法简介

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

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]$

结果,

正常运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值