最近看代码看到python里面的yield关键字,和我之前接触的语言好像都没有来着,我就查了查它的含义,大概理解如下:

>>> def createGenerator():
... mylist = range()
... for i in mylist:
... yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
... print(i)
    1.它和return差不多的用法,只是最后是返回了一个生成器。
    2.了解yield 必须知道,当你调用yield所在的那个函数的时候,那个函数并没有运行,只会返回一个生成器的对象。

    3.当你第一次在for中调用生成器的的对象,它将会运行你函数中的代码从最开始一直到到碰到了yield的关键字,然后它会返回循环中的第一个值。然后每一次其他的调用将会运行你在这个函数中所写的循环多一次,并且返回下一个值,知道没有值可以返回了。
生成器可以认为是空的,如果这个函数运行但是没有运行到yield上。这也许是因为循环的结束,也许是因为你没有写一个安全的if/else。
这里又涉及到生成器的问题:
    生成器和迭代器差不多,但是它只能运行一次,因为它不是把值存在内存中,而是直接运行生成值,所以我理解应该是定义的时候需要代码块的。
 
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
... print(i) >>> for i in mygenerator:
... print(i)

再运行一次for就不会打印出来东西了。


当然 上面的理解来自于:
http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python
挺好的。
很想吐槽下,我查内地的网站的这个关键字的解释,给出的代码实例就把我绕晕了,并且拆开来看完全没有必要给那么复杂的代码事例。
 

python yield 关键字的更多相关文章

  1. (转) Python Generators(生成器)——yield关键字

    http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...

  2. 解析Python中的yield关键字

    前言 python中有一个非常有用的语法叫做生成器,所利用到的关键字就是yield.有效利用生成器这个工具可以有效地节约系统资源,避免不必要的内存占用. 一段代码 def fun(): for i i ...

  3. Python:容器、迭代对象、迭代器、生成器及yield关键字

            在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list, ...

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

    Python:笔记(7)——yield关键字 yield与生成器 所谓生成器是一个函数,它可以生成一个值的序列,以便在迭代中使用.函数使用yield关键字可以定义生成器对象. 一个例子 我们调用该函数 ...

  5. python中的yield关键字

    yield关键字一直困扰了我很久,一直也没有弄明白,现在将暂时理解的yield记录如下,供参考: 关键词:可迭代对象,生成器,迭代器 一.可迭代对象: 可迭代对象:可迭代对象是一个泛称,只要可以用fo ...

  6. 深入理解python中的yield关键字

    想必大家都看过这样的代码: 上面的这段代码会计算0-9的平方并打印出来. 那么问题来了,这段代码和我们要说的东西有什么区别呢? 这里的关键字,yield,我在前面的文章里已经发过了.那么yield是什 ...

  7. Python yield与实现

    Python yield与实现  yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭 ...

  8. Python yield 使用浅析

    转载来自: http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 初学 Python 的开发者经常会发现很多 Pyth ...

  9. 【转】Python yield 使用浅析

    转载地址: www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ Python yield 使用浅析 初学 Python 的开发者经 ...

随机推荐

  1. aruba 开启802.1X认证

    1.即在ac上指定一个radius server认证 2.创建本地账户测试

  2. 学习一下sticky-footer

    什么是sticky-footer? 当页面长度不够长的时候,页脚粘贴在视窗底部:如果页面足够长时页脚会被内容向下推送. 实现方式: 1.负margin布局方式 给内容div加一个父div,设置父div ...

  3. C#编码问题以及C#往Mysql插数据编码问题

    C#将字符转换成utf8编码 GB321编码转换   public static string get_uft8(string unicodeString) { UTF8Encoding utf8 = ...

  4. select 两层 第二个select需要加别名

    select t.id from (select xxx) t

  5. 使用Snappy将html或者url转成PDF文件

    这是一个操作简单的html文件或者url转PDF的php库 Github地址 https://github.com/KnpLabs/snappy 安装: $ composer require knpl ...

  6. spark 线性回归算法(scala)

    构建Maven项目,托管jar包 数据格式 //0.fp_nid,1.nsr_id,2.gf_id,2.hydm,3.djzclx_dm,4.kydjrq,5.xgrq,6.je,7.se,8.jsh ...

  7. 简单的StringBuffer实现

    package com.letv.test.base; import java.util.Arrays; public class StringBuffer { private char[] valu ...

  8. egret 取消自动连接github

  9. 在linux上添加硬盘

    首先呢我们需要添加一个硬盘,如下所示: 接着我们需要新建一个硬盘 代码如下: mkdir /bak fdisk -l 接着我们继续第二步,分区 代码如下: fdisk /dev/sdb n   add ...

  10. gambit软件license文件

    最近自己的gambit软件license文件已经到期,后面采用fluent的license文件后,可以使用,但不能导入文件.不过通过努力,终于找到了可以实现导入文件的代码,并且可以实现无限期的使用fl ...