Python:笔记(7)——yield关键字

yield与生成器

  所谓生成器是一个函数,它可以生成一个值的序列,以便在迭代中使用。函数使用yield关键字可以定义生成器对象。

一个例子

  我们调用该函数,就会发现其中的代码不会开始执行

def countdown(n):
print('从%d开始减少'%n)
while(n>0):
yield n
n-=1
return countdown(10)

  相应的,该函数返回一个生成器对象。接着该生成器对象就会在__next__被调用时执行函数,如:

c = countdown(10)
# <generator object countdown at 0x102d0b780>
print(c.__next__())
# 10
print(c.__next__())
# 9

  调用next时,生成器函数开始执行语句,直至遇到yield语句为止。yield语句在函数执行停止的地方生成一个结果,直至再次调用next。然后继续执行yield之后的语句。

生成器的用法

  通常不会在生成器上直接调用next()方法,而是通过for语句,sum()或一些消耗序列的其他操作使用生成器。

for n in countdown(5):
print(n) print(sum(countdown(5)))

  

协程与yield表达式

  在函数内,yield语句还可以作为表达式使用,出现在赋值运算符的右边,例如:

def receiver():
print('Ready to receive')
while True:
n = (yield)
print(n) r = receiver()
r.__next__()
# Ready to receive
r.send(1)
# 1
r.send(2)
# 2
r.send('Hello')
# Hello

  以这种方式使用yield语句的函数称为协程,向函数发送值时函数将执行。接收到值后,协程就会执行语句,直至遇到下一个yield语句。

说明:一开始必须先执行next函数,这样协程才能执行第一个yield表达式之前的语句

关闭协程

  协程一般会不断地执行下去,除非被显式关闭或自己退出,显式关闭执行close语句即可。

最新文章

  1. rabbitMQ学习(二)
  2. LINQ语法记录
  3. centos MariaDB10.1.X galera cluster
  4. Markdown常用基本语法
  5. ajax的参数
  6. reduce()
  7. 查看SharePoint list的xml
  8. Android学习【Android内核编译流程和错误笔记】
  9. decimal ? 含义
  10. javaFile循环列出指定目录下的所有文件(源代码)
  11. JS语句
  12. java web Servlet 学习笔记 -3 会话管理技术
  13. 解决阿里云服务器3306端口无法访问的问题(windows server 2008r2)
  14. Got error -1 from storage engine
  15. Spring Boot下Druid连接池+mybatis
  16. 动态显示checkbox选中条数
  17. Django框架(二) MTV模型简介
  18. 迷你MVVM框架 avalonjs 学习教程10、样式操作
  19. Netty源码分析第2章(NioEventLoop)----&gt;第6节: 执行select操作
  20. python list添加元素的几种方法

热门文章

  1. day07&lt;面向对象+&gt;
  2. apache编译安装完成后的服务启动设置
  3. 佛祖保佑永无bug
  4. iOS - xib中关于拖拽手势的潜在错误
  5. 【Redis】 make编译是提示 make cc Command not found
  6. Linux 2.6.16 TCP连接速度异常的问题分析
  7. Excel 2010 如何将筛选后的数据复制粘贴到另一个工作表筛选后的表格里
  8. 【BZOJ1045】[HAOI2008] 糖果传递 贪心
  9. Python - 3.6 学习第一天
  10. HDCMS留言插件的使用!