Python:笔记(7)——yield关键字
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语句即可。
Python:笔记(7)——yield关键字的更多相关文章
- (转) Python Generators(生成器)——yield关键字
http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...
- 解析Python中的yield关键字
前言 python中有一个非常有用的语法叫做生成器,所利用到的关键字就是yield.有效利用生成器这个工具可以有效地节约系统资源,避免不必要的内存占用. 一段代码 def fun(): for i i ...
- python中的yield关键字
yield关键字一直困扰了我很久,一直也没有弄明白,现在将暂时理解的yield记录如下,供参考: 关键词:可迭代对象,生成器,迭代器 一.可迭代对象: 可迭代对象:可迭代对象是一个泛称,只要可以用fo ...
- 深入理解python中的yield关键字
想必大家都看过这样的代码: 上面的这段代码会计算0-9的平方并打印出来. 那么问题来了,这段代码和我们要说的东西有什么区别呢? 这里的关键字,yield,我在前面的文章里已经发过了.那么yield是什 ...
- python yield 关键字
最近看代码看到python里面的yield关键字,和我之前接触的语言好像都没有来着,我就查了查它的含义,大概理解如下: >>> def createGenerator(): ... ...
- python协程--yield和yield from
字典为动词“to yield”给出了两个释义:产出和让步.对于 Python 生成器中的 yield 来说,这两个含义都成立.yield item 这行代码会产出一个值,提供给 next(...) 的 ...
- Python:容器、迭代对象、迭代器、生成器及yield关键字
在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list, ...
- python笔记之itertools模块
python笔记之itertools模块 itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生 ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
随机推荐
- java中Double的isInfinite()和isNaN()
在Double和Float类中都有这两个方法,用于判断是否是无穷大及是否为非数字 public boolean isInfinite()如果此对象表示的值是正无穷大或负无穷大,则返回 true:否则返 ...
- Zookeeper(一)-- 简介以及单机部署和集群部署
一.分布式系统 由多个计算机组成解决同一个问题的系统,提高业务的并发,解决高并发问题. 二.分布式环境下常见问题 1.节点失效 2.配置信息的创建及更新 3.分布式锁 三.Zookeeper 1.定义 ...
- /etc/security/limits.conf
ulimit 命令用来限制系统用户对 shell 资源的访问,但只是临时生效,想要永久生效需要配置 /etc/security/limits.conf 文件,语法及常见配置如下: [root@loca ...
- VS2015编译TIFF3.8.0源码
没有CMakeLists.txt,不能使用CMake GUI了.源文件中有makefile.vc,所以使用nmake 进入VS2015命令行 nmake -f makefile.vc 修改nmake. ...
- php学习十四:抽象,接口和多态
多态为面向对象编程的精华所在,js等面向过程的语言虽然可以模拟面向对象,但是毕竟模仿的永远比不上真的,所以了解而且会使用面向对象的多态是必不可少的 在了解多态之前,我们必须要了解接口,但是接口又是在抽 ...
- AndroidWear开发之下载SDK[Android W/Android L]
Android L Developer Preview SDK发布了,但是天朝还是无法更新到.打开SDK Manager依旧一成不变,这时候就需要利器了. 第一步: 打开Goagent,不要说不知道什 ...
- poj_1182 并查集
题目大意 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人 ...
- poj_3321 线段树/树状数组
题目大意 一个果树(每个节点的分叉数目不固定)上有N个分叉点(包括最末的叶节点),则有N-1条边,将分叉点进行从1到N编号,每个分叉点上均可以结水果.开始的时候,每个分叉点都有一个水果,之后进行一系列 ...
- activemq 实战 一
This chapter covers Introduction to the use case for each of the book examples Use of Maven for ...
- (转)从程序员到CTO
好好努力吧,向优秀的人看齐.文章来自http://blog.csdn.net/smarttony/article/details/6697617