包含了关键字"yield"的函数就不是普通的函数。当含有这个关键字的函数被调用的时候,这个函数在遇到yield的时候会停止运行,并且返回一个迭代器(iterator)。每次请求一个值,就会执行生成的代码。直到遇到一个yield或者return。

首先,我们先了解什么是迭代器。

lst=[1,2,3,4,5]
for i in lst
    print i
从这个例子我们可以看的出来,每循环一次i的值就会指向列表的下一个元素,大家认为这是正常的,那么为什么i会得到列表的下一个元素呢?
其实在for的循环中列表就使用了迭代器。每一次循环迭代器就使用next方法返回一个值。当然这个迭代是隐形的,大家是看不见的。
我们可以实现一个可迭代的函数。
#!/ust/bin/env python
class IterExample():
    def __init__(self):
        self.a = 0
    def next(self):
        self.a += 1
        if self.a > 10:raise StopIteration
        return self.a
    def __iter__(self):
        return self
ie = IterExample()
for i in ie:
    print i
上面的列表默认已经具备了迭代方法,不用我们实现。如果一个函数不是可迭代的那是不能用在循环里的。
下面我们来解决yield
其实这个很简单。只不过大家看的例子复杂了。看看下面的例子你立刻就会理解它。

#!/usr/bin/env python
#__metaclass__ = type
def gen():
        print 'enter'
        yield 1
        print 'next'
        yield 2
        print 'next again'
for i in gen():
        print i
#########################
这个例子打印如下:
enter
1
next
2
next again
我来解释一下这个程序:
首先大家要知道为什么这个函数可以用在for循环中。不用问,因为这个函数是可迭代的,也就是这个函数可以每次都返回一个值。
但是我们在gen()函数里看不到__iter__()和next() 方法。其实它隐藏在yield里。高级语言就是这样,隐藏了好多东西。这个和c
语言就不同了。C语言可以看到每个细节。在这里程序执行到yield 1的时候就停止了,下面的程序不再执行,然后返回一个值“1”.
当下一个for的之后程序接着往下执行到yeild 2。程序停止执行,然会返回一个值“2”。但是还有一个问题就是,最后yield下面的"next again" 会打印出来呢?这也可能就是在执行完最后一个yield 的时候,for i in gen()的时候, 发生了一些什么动作,导致最后一个yield后面的代码也被执行了。
如果我们修改一下这个程序如下:
#!/usr/bin/env python
#__metaclass__ = type
def gen():
        print 'enter'
        yield 1
        print 'next'
        return
        print 'next 2'
        yield 2
        print 'next 3'
for i in gen():
        print i

#######################
程序打印如下:
enter
1
next
看明白了这就是yield和return的区别。yield可以向下运行。而return返回后这个函数余下的部分就不能执行了。

python 之 yield相关推荐

  1. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  2. [翻译]Python中yield的解释

    问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...

  3. python中yield的认识与学习|生成器

    接触python,yield就有点难度啦.都知道包含这个yield的函数就不是普通函数啦.就是一个生成器函数. 类型:<generator object test1 at 0x01D89220& ...

  4. js date 当前日志往后一个月_【应用实例】如何利用 Python 生成器 yield 监控日志?...

    Python 生成器 yield 是编写基于处理管道,流或数据流程序的一种极其强大的方式,在<Python参考手册>中有一则实例非常简单实用,略加修改,分享一下给大家.如果你对生成器yie ...

  5. Python中yield简单用法

    Python中yield简单用法 你或许知道带有yield的函数在Python中被称之为generator,那何为 generator? 我们暂时抛开generator,先从一个常见编程题目开始,循序 ...

  6. python 中 yield 的使用

    python中yield在函数中的使用 正是因为函数含有这个yield,所以,该函数不再是普通的函数,而是生成器函数(generator function).下面通过小例子来说明一下这个内置函数的特性 ...

  7. python之yield

    原创博客链接:python之yield yield关键字之前见过,也能读懂,但开发时也不大敢使用,感觉理解还是不够充分.刚好项目代码中有涉及,顺便再学习学习. 在理解yield之前, 可迭代,迭代器, ...

  8. [Python] 关键字 yield 用法详解

    一个十分十分优秀的博客: python中yield的用法详解--最简单,最清晰的解释.

  9. python的yield是什么意思,python生成器是怎么使用的 python中yield是什么意思

    python中return和yield怎么用的?两个有什么区别?你从未驯服过她,她只是在爱你的时候收起獠牙. yield yield是用于生成器.什么是生成器,你可以通俗的认为,在一个函数中,使用了y ...

  10. python中yield的用法(生成器的讲解)

    2 理解说明yield与生成器 在Python中,使用yield的函数被称为生成器函数(generator function). 生成器有两种方法:next()和send(),都可以调用生成器 yie ...

最新文章

  1. ufldl matlab 工具箱,matlab的Deep Learning的toolbox 中的SAE算法
  2. 【机器视觉】 write_measure算子
  3. Jboss4集群配置【转】
  4. php7.0 yield,PHP7中生成器的新特性 yield-from amp;amp; return-values
  5. php更新svn,利用php进行svn更新的php代码及php执行svn更新注意事项
  6. 以下关于组装微型计算机的叙述 不正确的是,昆明理工大学 计算机系统练习题...
  7. bzoj4033: [HAOI2015]树上染色(树形dp)
  8. RNN,LSTM中如何使用TimeDistributed包装层,代码示例
  9. html 日期判断周几,javascript怎么根据日期判断星期几?
  10. solr4.8.1 + tomcat8 配置
  11. Layui 的内置jquery 版本
  12. 考察数据结构——第三部分:二叉树和BSTs[译]
  13. nodejs 安装模块失败 解决方法
  14. 学习产品基础知识学习沟通-每日打卡
  15. SpringBoot集成阿里云OSS上传文件
  16. 教学电子白板软件有哪些?分享一个实用工具
  17. filter()过滤器的用法(清晰明了)
  18. 如何使用条件格式在 Excel 中隔行加底纹
  19. TCP/IP:连接服务器失败(错误原因:Connection refused)
  20. ph值图片_[图]酸碱性食物怎样区分_常见食物的PH值图片

热门文章

  1. 真无线蓝牙耳机推荐:2021最受欢迎的TWS耳机品牌
  2. 含泪整理最优质现代家装su模型素材,你想要的这里都有
  3. matlab-采用For循环,将每次计算得到的矩阵,依次放进一个新的矩阵
  4. Google学术映像
  5. C++中的volatile(Primer读书笔记)
  6. caj打印PDF提示打印超范围应该怎么办?
  7. 推荐几款好用的企业级文档管理软件
  8. 深度学习--FAISS向量数据库
  9. python市场_大交易数据的python市场篮子分析
  10. 第一二天作业-BGP MPLS + OSPF分流互备做法