研究Python 之 yield

学习在于细节,当你已经写过一两个项目,你就会在闲暇时间来鼓捣 基础知识

本文是参考一篇博客而写的

好像有了一个月的时间没有更新博客了,事先说明:我不是懒哇,我在鼓捣js的基础知识。
这都不是今天的重点啊,我想一个一个小知识点攻破。要练成什么段位,全靠这些了!
今天的主角是 yield。
以前我真不知道,看过很多参考书籍,但就是没有真正的整明白。

可迭代对象

首先要说的是 可迭代的对象

>>>mylist=[x*x for x in range(3)]
>>>for i in mylist:
        print(i)
0
1
4

这里,所有的指都存在内存里,所以不合适存放大量数据,看明白了吧。

生成器

  • 可迭代
  • 只能读取一次,不能后退
  • 实时生成数据,不存在内存中
    >>> mygennerator=(x*x for x in range(5))
    >>> for i in mygennerator:
    ...     print(i)
    ...
    0
    1
    4
    9
    16
    >>>
    
    注意你之后不能再次使用 for i in mygennerator了
    >>> for i in mygennerator:
    ...     print(i)
    ...
    >>>
    
    没结果了

    yield关键字

  • yield 是一个类似于 return 的关键字,只是这个函数返回的是一个生成器对象
  • 当你使用for进行迭代的时候,函数中的代码才会执行
    >>> def createGennerator():
    ...     mylist=range(5)
    ...     for i in mylist:
    ...          yield i*i
    ...
    >>> mygennerator=createGennerator()
    >>> type(mygennerator)
    <class 'generator'>
    >>> print(mygennerator)
    <generator object createGennerator at 0x0404BB10>
    >>> for i in mygennerator:
    ...     print(i)
    ...
    0
    1
    4
    9
    16
    
    第一次迭代中你的函数会执行,从开始达到yield关键字,然后返回yield后的值作为第一次迭代的返回值。
    然后,每次执行这个函数都会继续执行你在继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的为止。

参考文献

本文参考链接:

https://blog.csdn.net/libbyandhelen/article/details/78957369

还有一篇文章值得读一下:

https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

相关文章