python yield.docx
《python yield.docx》由会员分享,可在线阅读,更多相关《python yield.docx(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、python yield 这篇文章主要介绍了Python yield 运用浅析,本文给出了多个运用实例来分析yield的运用方法,须要的挚友可以参考下 初学 Python 的开发者常常会发觉许多 Python 函数中用到了 yield 关键字,然而,带有 yield 的函数执行流程却和一般函数不一样,yield 究竟用来做什么,为什么要设计 yield ?本文将由浅入深地讲解 yield 的概念和用法,帮助读者体会 Python 里 yield 简洁而强大的功能。 您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我
2、们先抛开 generator,以一个常见的编程题目来展示 yield 的概念。 如何生成斐波那契數列 斐波那契(Fibonacci)數列是一个特别简洁的递归数列,除第一个和其次个数外,随意一个数都可由前两个数相加得到。用计算机程序输出斐波那契數列的前 N 个数是一个特别简洁的问题,很多初学者都可以轻易写出如下函数: 清单 1. 简洁输出斐波那契數列前 N 个数 代码如下: def fab(max): n, a, b = 0, 0, 1 while n < max: print b a, b = b, a + b n = n + 1 执行 fab(5),我们可以得到如下输出: 代码如下:
3、>>> fab(5) 1 1 2 3 5 结果没有问题,但有阅历的开发者会指出,干脆在 fab 函数中用 print 打印数字会导致该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列。 要提高 fab 函数的可复用性,最好不要干脆打印出数列,而是返回一个 List。以下是 fab 函数改写后的其次个版本: 清单 2. 输出斐波那契數列前 N 个数其次版 代码如下: def fab(max): n, a, b = 0, 0, 1 L = while n < max: L.append(b) a, b = b, a + b n = n +
4、 1 return L 可以运用如下方式打印出 fab 函数返回的 List: 代码如下: >>> for n in fab(5): . print n . 1 1 2 3 5 改写后的 fab 函数通过返回 List 能满意复用性的要求,但是更有阅历的开发者会指出,该函数在运行中占用的内存会随着参数 max 的增大而增大,假如要限制内存占用,最好不要用 List 来保存中间结果,而是通过 iterable 对象来迭代。例如,在 Python2.x 中,代码: 清单 3. 通过 iterable 对象来迭代 代码如下: for i in range(1010): pass 会
5、导致生成一个 1010 个元素的 List,而代码: 代码如下: for i in xrange(1010): pass 则不会生成一个 1010 个元素的 List,而是在每次迭代中返回下一个数值,内存空间占用很小。因为 xrange 不返回 List,而是返回一个 iterable 对象。 利用 iterable 我们可以把 fab 函数改写为一个支持 iterable 的 class,以下是第三个版本的 Fab: 清单 4. 第三个版本 代码如下: class Fab(object): def _init_(self, max): self.max = max self.n, self.
6、a, self.b = 0, 0, 1 def _iter_(self): return self def next(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a + self.b self.n = self.n + 1 return r raise StopIteration() Fab 类通过 next() 不断返回数列的下一个数,内存占用始终为常数: 代码如下: >>> for n in Fab(5): . print n . 1 1 2 3 5 然而,运用 clas
7、s 改写的这个版本,代码远远没有第一版的 fab 函数来得简洁。假如我们想要保持第一版 fab 函数的简洁性,同时又要获得 iterable 的效果,yield 就派上用场了: 清单 5. 运用 yield 的第四版 代码如下: def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # print b a, b = b, a + b n = n + 1 第四个版本的 fab 和第一版相比,仅仅把 print b 改为了 yield b,就在保持简洁性的同时获得了 iterable 的效果。 调用第四版的 fab 和其次版的 fab
8、完全一样: 代码如下: >>> for n in fab(5): . print n . 1 1 2 3 5 简洁地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个一般函数,Python 说明器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句接着执行,而函数的本地变量看起来和上次中断执行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- python yield
限制150内