1 yield 在使用send, next时候的区别(举例m = yield 5)

  无论send,next首先理解m = yield 5 是将表达式"yield 5 "的结果返回给m, 而不是m=5这么简单, 所以涉及到如何获取表达式yield 5的值,这就和next,send有关。

  当send(arg)时,就会将arg 认为yield 5表达式的结果赋给m,而如果是next,就会将None作为yield 5表达式的结果付给m;

  所以可认为next 等效于send(None),除了第一次next外

  

  区别就是:

    使用next()时,第一次next, 在遇到yield停止,并且将yield右边的表达式“5”作为next函数的返回值返回给外界; 之后的next,会将None作为yield 5表达式的值赋给m,

    程序往下执行,遇到下一个yield时,将yield右边的表达式5作为该次的next的返回值

    使用send(arg)时(前面必须已经使用了next), 将arg作为yield表达式"yield 5"的值,赋给m;程序往下执行,然后将下个yield的右边表达式"5"作为send函数的返回值 

  

  next例子:

def f():
print("start")
current = yield "hello"
print('current=', current)
while True:
value = yield "bad"
# value = value + 'not' # 此行会报错,因为value会为None, 不能和字符串进行相加 g = f()
s1 = next(g)
print('s1=',s1)
# 第一次Next时,停止在第5行, 将yield右边的表达式(无即None)作为next()的返回值 s2 = next(g)
print('s2=', s2)
# 第二次的next,会将None作为yield表达式" yield hello"的值赋给current, 即current = None
# 然后程序往下执行,遇到yield "bad"停止,将yield右边的表达式"bad"作为第二次next的返回值 s3 = next(g)
print('s3=',s3)
# 第三次next,会将None作为yield表达式”yield bad"的值赋给value, 即value = None,
# 程序往下执行,遇到value = yield "bad"停止,将"bad"作为第三次next的返回值

  send例子:

def f():
print("start")
current = yield "hello"
print('current=', current)
while True:
value = yield "bad"
print("value=",value)
# value = value + 'not' # 此行会报错,因为value会为整形, 不能和字符串进行相加 g = f()
s1 = next(g)# 这一步不能少
# 第一次Next时,停止在第5行, 将yield右边的表达式(无即None)作为next()的返回值
print(g.send(10))
# 生成器调用第一次send时,将send参数10代替表达式"yield hello"的值,赋给current,
# 然后程序往下执行,在遇到yield bad停止,将"bad"作为第一次send()函数的返回值返给外界
print(g.send(20))
# 生成器第二次调用send时,将send参数20代替表达式"yield bad"赋给 value
# 程序往下执行,然后遇到yield bad停止,将"bad"作为第二次send()函数的返回值返给外界

   

2 yield与生成器generator

  函数里面使用了yield不再是函数,而是一个生成器generator。 比如

def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
# print b
a, b = b, a + b
n = n + 1

  当执行g = fab(5)时,不是调用函数,而是实例化一个生成器对象。 当循环g对象或者next(g)时才会调用fab函数里面的代码

def test():
# print('one')
yield 1
# print('two')
yield 2 g = test()
for i in g:
print(i) # 应该和下面效果是一样的:
g = test()
res = next(g)
print(res)
# 首次遇到next()会执行test代码,并停留在yield 1 处,
# 同时将yield 后面表达式的值作为next的返回值返回给外界
#
res = next(g)
print(res)
# 接着上面保存的地方,运行print two,
# 碰到yield 2 ,停止并把后面的2作为Next的返回值返回给外界

3 生成器是有状态的,调用者不可反复使用它。比如:

def test():
yield 1
yield 2 g = test()
for i in g:
print(i) # 下面这里是没有效果的
for i in g:
print('hello')
print(i)

  

最新文章

  1. git clone 出错SSL certificate problem, verify that the CA cert is OK.
  2. gcc/g++命令认识
  3. FUSE and File System
  4. flex 事件注册和鼠标拖动
  5. 201521123045 《Java程序设计》 第10周学习总结
  6. linux mysql 修改 UTF-8编码
  7. iOS常用控件尺寸大集合
  8. UEditor之实现配置简单的图片上传示例 转
  9. [CQOI2017]老C的方块
  10. net core体系-web应用程序-4net core2.0大白话带你入门-3asp.net core项目架构和配置文件解读
  11. 微信小程序之---- 数据处理
  12. 2.html基础标签:无序+有序+自定义列表
  13. solidity return data和revert/require的reason string的获得
  14. android第二课:运行你的应用
  15. 【译】第8节---EF Code First中配置类
  16. 力扣(LeetCode) 9.回文数
  17. Spring Boot log4j实现把日志存入mongodb
  18. 每日踩坑 2018-09-29 .Net Core 控制器中读取 Request.Body
  19. MongoDB注册Windows服务启动
  20. 学习laravel源码之中间件原理

热门文章

  1. openlayers 初步认识(转)
  2. Android(java)学习笔记79:Android中SimpleAdapter,ArrayAdapter和BaseAdapter常见的适配器
  3. [论文理解]MetaAnchor: Learning to Detect Objects with Customized Anchors
  4. 2018.6.4 Oracle数据库预定义的异常列表
  5. python读取图像
  6. JS起源
  7. 洛谷P2468 [SDOI2010]粟粟的书架(二分答案 前缀和 主席树)
  8. BZOJ1093: [ZJOI2007]最大半连通子图(tarjan dp)
  9. 多种方式实现依赖注入及使用注解定义bean
  10. 三 python并发编程之多线程-重点