背景

首先,我不会解释这两个名词,我看过很多遍解释,可还是看不懂,还是直接看使用情景吧。

我们以佩波拉契数列为例,当我们不知道迭代器的情况下,我们写出来的代码可能是这样子的:

'''这种方式计算fib(100)都很吃力'''
fib = lambda n:fib(n-2) + fib(n-1) if n>1 else 1

或者优化一下,变成这样子:

'''
将迭代结果存入temp中,避免重复的计算,
这样可以提高计算速度,但是当计算fib(4000)时,会报:
“maximum recursion depth exceeded in comparison”
也就是说会超过最大迭代次数
'''
temp = {}
def fib(n):
if n in temp:
return temp[n] if n>1:
_t = fib(n-1) + fib(n-2)
temp[n] = t
return _t
else:
return 1

考虑到进一步的优化,我们就需要引进python的yield 语法

使用yield

yield的用法简单来说就 返回yield运行结果,当调用__next__时,再次运行至yield处,并返回 。所以我们可以利用这一特点,让fib函数每次只返回当前和前一个的值,再次运行时更新这两值, 并返回就好了。于是有了下面的代码:

'''
这次我们可以最大程度发挥计算机性能,
比上个版本能计算的更多也更快(我电脑能计算6位数的fib值)
'''
def fib_gen():
'''
这时一个佩波拉契数列的生成器,每次迭代返回当前值和前一个的值
'''
c , p = 1,1
while True:
yield p # 每次next运行到此,并返回p的值。当再次调用时,继续执行下面代码,
p, c = c, c+p # 计算下次p的值 def fib(n):
'''根据情况不断运行next(f),直到适合的条件'''
f = fib_gen()
for i in range(n+1):
cur = next(f)
return n

我们在看一个简单的生成器的例子

In [1]: array = [1,2,3,4]

In [2]: f = (i for i in array) # 是不是看起来很像“元组推倒式”,其实这是一个生成器。python并没有元组的推倒式

In [3]: f # 不信,我们来实际看看
Out[3]: <generator object <genexpr> at 0x10882df10> In [4]: [i for i in f] # 生成器是可以迭代的,所以列表推到能取出值
Out[4]: [1, 2, 3, 4] In [5]: [i for i in f]
Out[5]: [] # 此时,f中的数据全部取出,调用next(f) 取不出来值了

总结

  • 从这个例子中我们可以发现,当使用yield后,函数并不是立刻执行,而是调用next的时候,我们才取出值,没调用的时候,它只是一个生成器。相当于保存了上次运行的现场。
  • 当调用next时,没有找到yield返回时,便会终止,并报StopIteration错误, 本例子中是死循环,不会发生这种情况。感兴趣的可以把while True 改成while p < 100之类的试试

python 生成器与迭代器(yield 用法)的更多相关文章

  1. Python 生成器与迭代器 yield 案例分析

    前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...

  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生成器和迭代器,with上下文管理工具

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

  9. Python基础之函数:6、异常相关和生成器对象、yield用法、生成器表达式

    目录 一.异常常见类型 1.类型错误 2.缩进错误 3.索引错误 4.语法错误 5.属性错误 6.key键错误 二.异常处理语法结构 1.基本语法结构 2.查看错误类型 3.针对不同类型所作措施 4. ...

随机推荐

  1. git使用笔记-提高篇

    一.分支.合并 1.合并一个特定提交 a specific commit git cherry-pick commit-id 把commit-id代表的本次提交合并到当前分支,如果有冲突需要解决后,提 ...

  2. [转]分享20佳好玩的 jQuery 游戏

    本文转自:http://www.cnblogs.com/lhb25/archive/2011/04/17/2001089.html jQuery是时下最流行的 JavaScript 库.现在,除了HT ...

  3. SSM-@Transactional 注释不生效

    1.在applicationConext.xml 中配置事务注解驱动 <!-- 事务注解驱动 --> <tx:annotation-driven /> <!-- 配置事务 ...

  4. 集合类中modCount字段的作用

    ArrayList.LinkedList.HashMap中都有一个字段叫modCount.这个字段的用途,在ArrayList的父类AbstractList源码中有注释,说的很清楚: /** * Th ...

  5. Android多线程源码学习笔记一:handler、looper、message、messageQueue

    最近在学习Android多线程相关知识的源码,现在把自己的笔记整理一下,写出来加深印象. Android多线程通讯的核心是handler.looper.message.messageQueue,这篇文 ...

  6. Windows窗体应用开发1

    1.Windows窗体的基本概念 2.Windows窗体应用程序 3.Windows窗体常见界面元素 4.Windows窗体中的事件处理 1.Windows窗体的基本概念 打开一个Window的系统应 ...

  7. 在项目引用里添加上对Microsoft Word 11.0 object library的引用

    private void button1_Click(object sender, System.EventArgs e) { //调用打开文件对话框获取要打开的文件WORD文件,RTF文件,文本文件 ...

  8. [LeetCode]11. Container With Most Water 盛最多水的容器

    Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...

  9. hdu 4123 树形DP+单调队列

    http://acm.hust.edu.cn/vjudge/problem/25790 这题基本同poj 3162 要注意mx,mx2,vx,vx2每次都要初始化 #include <iostr ...

  10. one + two = 3

    读入两个小于100的正整数A和B,计算A+B.需要注意的是:A和B的每一位数字由对应的英文单词给出. 输入 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =", ...