博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Python中的yield
阅读量:7081 次
发布时间:2019-06-28

本文共 1269 字,大约阅读时间需要 4 分钟。

hot3.png

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

一、迭代器(iterator)

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

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

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

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

12
 line  .:     line

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

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

12
 line  :        line

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

二、生成器(constructor)

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

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

12345678
  gn:...      i  n:...              i ...  i  g:...      i,,... :  :  :  :  :

要了解他的运行原理,我们来用next方法看看:

123456789101112131415
 t = g t. t. t. t. t. t.Traceback most recent call last:  File , line ,  module

在运行完5次next之后,生成器抛出了一个StopIteration异常,迭代终止。

再来看一个yield的例子,用生成器生成一个Fibonacci数列:

12345678910
 fab:    a,b = ,     a  :         a        a, b = b, a+b   i  fab:...      i,,... ,  ,  ,  ,  ,  ,  ,  ,

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

转载于:https://my.oschina.net/ghm7753/blog/480718

你可能感兴趣的文章
oracle 10g/11g RAC 启停归档模式
查看>>
MongoDB 删除数据库
查看>>
Centos6 Nginx安装
查看>>
python 11 函数名 迭代器
查看>>
oracle归档日志管理
查看>>
两个链表的第一个公共节点
查看>>
类代码
查看>>
js的闭包原理理解
查看>>
Android AIDL 一探究竟
查看>>
P问题、NP问题和NPC问题
查看>>
vmwear导出OVF模板解析(解决ovf导入服务器失败问题,虚拟机版本等)
查看>>
Nginx 的两种认证方式
查看>>
mysql连表分组报错---- sql_mode=only_full_group_by问题解决
查看>>
让 scrollview动起来,
查看>>
第二周作业
查看>>
Surrounded Regions
查看>>
NodeJS学习笔记之MongoDB模块
查看>>
有趣的js题目
查看>>
OVN conntrack flag
查看>>
UVa11020 · Efficient Solutions
查看>>