前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天。然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头。)。然后只能 花点时间 回顾一下 廖雪峰老师 Python前面的课程内容了 并对廖老师的课程内容做了以下总结:

迭代器(iter):迭代器是访问集合元素的一种方式。迭代器的对象从集合的第一个元素开始访问,直到所有的元素被访问结束。迭代器只能往前不会退后。

不过也没什么,因为很少在迭代过程中往后退。另外迭代器一大优点是不需要准备好整个迭代过程中的所有元素。迭代器仅仅在迭代

到某个元素时才计算该元素,而在这之前或者之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或者无限的集合

,比如几个G的文件。

生成器(generator):一个函数返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就变成生成器。

Yield:yield的主要作用就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以重新调用这个

函数,从上次yield的下一句开始执行。

首先,先来看一个“斐波那契数列”(从第三个数开始,每位的值都等于前两个数的和)的例子

def Fibonacci(max):
n , a, b = 0 , 0 , 1
while n < max:
print(b)
a , b = b, a + b
n = n + 1
# 输出前十位
Fibonacci(10)

得出的结果:

E:\Python>python test.py
1
1
2
3
5
8
13
21
34
55

PS: Fibonacci 这个函数大家有没有发现一个问题, 这个函数是没有返回值的,也就是说,基本上是无法复用的。如果要提高 fab 函数的可复用性,那么要怎么做的?

用一个List 把要输出的值保存下来。如下:

def Fibonacci(max):
n , a, b = 0 , 0 , 1
len = []
while n < max:
len.append(b)
a , b = b, a + b
n = n + 1
return len # 调用函数
for n in Fibonacci(10):
print(n)

输出结果:

1
1
2
3
5
8
13
21
34
55

PS: 如上就是我们经常看到的函数, 但是有经验的开发者们会发现一个问题, 内存问题, 如果 max的大小和 占用内存的大小是成正比的,也就是说max越大,占用资源就越多。

这个时候使用 Yield 使得函数返回值变成迭代器来解决这个问题,如下例子:

def Fibonacci(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, b + a
n = n + 1
# 调用返回
for n in Fibonacci(10):
print(n)

输出结果:

1
1
2
3
5
8
13
21
34
55

PS:上面Fibonacci 返回的就是一个迭代器。

肯定有小伙伴会问道,迭代器的原理是什么?

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

这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。

而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

也就是第一次next 生成器函数 只执行到 第四行(yield b)

这个时候再执行一次 next  那么生成器函数会从第五行还是执行。 就是这样一步步推算下来。

当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。

以上。

如果有什么讲的不好地方,希望大家批评指正。

Python 生成器与迭代器 yield 案例分析的更多相关文章

  1. 开始 python programming第三版案例分析

    最近研究python,打算将python programming第三版案例分析下 但是全书1600多页 比较费时 而且 介绍太多 感觉没有必要! python programming 堪称经典之作 第 ...

  2. python 生成器和迭代器

    迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退) 2.可迭代对象:实现了 ...

  3. python 生成器和迭代器有这篇就够了

    本节主要记录一下列表生成式,生成器和迭代器的知识点 列表生成器 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每个值加1,你怎么实现呢? 方法一(简 ...

  4. Python生成器,迭代器,可迭代对象

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

  5. 【转】python 生成器和迭代器有这篇就够了

    总结得特别好,转自:https://www.cnblogs.com/wj-1314/p/8490822.html 本节主要记录一下列表生成式,生成器和迭代器的知识点 列表生成器 首先举个例子 现在有个 ...

  6. Python 生成器 (generator) & 迭代器 (iterator)

    python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...

  7. python 生成器,迭代器,闭包,装饰器

    1.生成器,迭代器,闭包,装饰器的优点 生成器就是一类特殊的迭代器 迭代器的优点也即生成器的优点: 1.节约内存.python在使用生成器时对延迟操作提供了支持. 2.迭代到下一次的调用时,所使用的参 ...

  8. Python爬虫——Scrapy整合Selenium案例分析(BOSS直聘)

    概述 本文主要介绍scrapy架构图.组建.工作流程,以及结合selenium boss直聘爬虫案例分析 架构图 组件 Scrapy 引擎(Engine) 引擎负责控制数据流在系统中所有组件中流动,并 ...

  9. 每日一问:Python生成器和迭代器,with上下文管理工具

    1.生成器: 1.1 起源: 如果列表中有一万个元素,我们只想要访问前面几个元素,对其进行相关操作,通过for循环方式效率太低,并且后面的元素会浪费内存,还会受到内存限制,所以产生生成器来解决这个问题 ...

随机推荐

  1. ASP.Net MVC——使用 ITextSharp 完美解决HTML转PDF(中文也可以)

    前言: 最近在做老师交代的一个在线写实验报告的小项目中,有这么个需求:把学生提交的实验报告(HTML形式)直接转成PDF,方便下载和打印. 以前都是直接用rdlc报表实现的,可这次牵扯到图片,并且更为 ...

  2. UVA, 10336 Rank the Languages

    难点在于:递归函数和输出: #include <iostream> #include <vector> #include <algorithm> #include ...

  3. MySQL:常见使用问题

    内容 1.Linux 上安装 MySQL 2.单机上安装多实例 3.不知root密码情况下,修改root密码 1.Linux 上安装MySQL 安装步骤: 1)解压 tar.gz文件 -linux-g ...

  4. 2016年中国微信小程序专题研究报告

    2016年12月29日,全球领先的移动互联网第三方数据挖掘和分析机构iiMedia Research(艾媒咨询)权威首发<2016年中国微信小程序专题研究报告>. 报告显示,82.6%手机 ...

  5. 机器指令翻译成 JavaScript —— No.6 深度优化

    第一篇 中我们曾提到,JavaScript 最终还得经过浏览器来解析.因此可以把一些优化工作,交给脚本引擎来完成. 现代浏览器的优化能力确实很强,但是,运行时的优化终归是有限的.如果能在事先实现,则可 ...

  6. 简单的转盘抽奖——CSS动画优化

    前言 前两天去一家公司面试,被问到一些小游戏的东西.面试官提到了刷红包还有抽奖这些怎么实现,当时简单说了下思路,回来之后想想还是说的太轻描淡写了,干说不做就是耍流氓,所以就做了一个(Demo & ...

  7. ABP源码分析四十五:ABP ZERO中的EntityFramework模块

    AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...

  8. 错误: 从内部类中访问本 地变量vvv; 需要被声明为最终类型

    从github 下载了源码, 进行编译, 出现了下面的错误 E:\downloads\ff\elasticsearch-master\elasticsearch-master>GRADLE :b ...

  9. HTML5知识点总结

    HTML5知识点总结(一) 一.HTML新增元素 1.IE9版本以下支持HTML5的方法 <!--[if lt IE9]> <script src="http://cdn. ...

  10. js文章列表的树形结构输出

    文章表设计成这样了 后端直接给了无任何处理的json数据,现在要前端实现树形结构的输出,其实后端处理更简单写,不过既然来了就码出来 var doclist = [{ "id": 1 ...