Python中的yield浅析

 更新时间:2014年06月16日 11:34:11   投稿:junjie  
这篇文章主要介绍了Python中的yield浅析,对迭代器(iterator) 、生成器(constructor)一并做了分析,并用实例来说明,需要的朋友可以参考下

在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor)。

一、迭代器(iterator)

在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器

迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且捕捉StopIteration异常来确定何时离开。

使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。

比如要逐行读取一个文件的内容,利用readlines()方法,我们可以这么写:

复制代码 代码如下:

for line in open("test.txt").readlines():
    print line

这样虽然可以工作,但不是最好的方法。因为他实际上是把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了。

利用file的迭代器,我们可以这样写:

复制代码 代码如下:

for line in open("test.txt"):   #use file iterators
    print line

这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行。


二、生成器(constructor)

生成器函数在Python中与迭代器协议的概念联系在一起。简而言之,包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。函数也许会有个return语句,但它的作用是用来yield产生值的。

不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效

复制代码 代码如下:

>>> def g(n):
...     for i in range(n):
...             yield i **2
...
>>> for i in g(5):
...     print i,":",
...
0 : 1 : 4 : 9 : 16 :

要了解他的运行原理,我们来用next方法看看:
复制代码 代码如下:

>>> t = g(5)
>>> t.next()
0
>>> t.next()
1
>>> t.next()
4
>>> t.next()
9
>>> t.next()
16
>>> t.next()
Traceback (most recent call last):
  File "", line 1, in
StopIteration

在运行完5次next之后,生成器抛出了一个StopIteration异常,迭代终止。
再来看一个yield的例子,用生成器生成一个Fibonacci数列:

复制代码 代码如下:

def fab(max):
    a,b = 0,1
    while a < max:
        yield a
        a, b = b, a+b

>>> for i in fab(20):
...     print i,",",
...
0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 ,


看到这里应该就能理解生成器那个很抽象的概念了吧~~

相关文章

  • 用Python实现给Word文档盖章

    用Python实现给Word文档盖章

    大家好,本篇文章主要讲的是用Python实现给Word文档盖章,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 利用Python实现自动生成图文并茂的数据分析

    利用Python实现自动生成图文并茂的数据分析

    这篇文章主要介绍了利用Python实现自动生成图文并茂的数据分析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • Python中的并发处理之asyncio包使用的详解

    Python中的并发处理之asyncio包使用的详解

    本篇文章主要介绍了Python中的并发处理之asyncio包使用的详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 教你使用conda虚拟环境管理(创建、激活、重命名、删除虚拟环境)

    教你使用conda虚拟环境管理(创建、激活、重命名、删除虚拟环境)

    conda是一个强大的Python包管理和环境管理工具,它可以帮助我们轻松地安装、更新、卸载和切换不同版本的Python和各种第三方库,本文就来介绍一下conda虚拟环境管理(创建、激活、重命名、删除虚拟环境),感兴趣的可以了解一下
    2024-01-01
  • TensorFlow人工智能学习数据填充复制实现示例

    TensorFlow人工智能学习数据填充复制实现示例

    这篇文章主要为大家介绍了TensorFlow人工智能学习如何进行数据填充复制的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • Python with的用法

    Python with的用法

    with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能。with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
    2014-08-08
  • python设置环境变量的几种方法总结

    python设置环境变量的几种方法总结

    这篇文章主要介绍了在Python中设置环境变量可以通过多种方式实现,包括使用os.environ、os.putenv、setuptools以及在操作系统级别设置,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • 基于np.arange与np.linspace细微区别(数据溢出问题)

    基于np.arange与np.linspace细微区别(数据溢出问题)

    这篇文章主要介绍了基于np.arange与np.linspace细微区别(数据溢出问题),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 利用Python将list列表写入文件并读取的方法汇总

    利用Python将list列表写入文件并读取的方法汇总

    因为实验需要,实现了一下写入txt文件,下面这篇文章主要给大家介绍了关于如何利用Python将list列表写入文件并读取的几种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 详解Python Flask API 示例演示(附cookies和session)

    详解Python Flask API 示例演示(附cookies和session)

    这篇文章主要为大家介绍了Python Flask API 示例演示(附cookies和session)详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论