源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Python函数式编程指南(四):生成器详解

  • 时间:2020-10-03 06:14 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Python函数式编程指南(四):生成器详解
[b]4. 生成器(generator)[/b] [b]4.1. 生成器简介[/b] 首先请确信,生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。 从Python 2.5开始,[PEP 342:通过增强生成器实现协同程序]的实现为生成器加入了更多的特性,这意味着生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。 [b]4.2. 生成器函数[/b] [b]4.2.1. 使用生成器函数定义生成器[/b] 如何获取一个生成器?首先来看一小段代码:
[url=http://pypi.python.org/pypi/pipe]http://pypi.python.org/pypi/pipe[/url] 之所以要介绍这个库,是因为它向我们展示了一种很有新意的使用迭代器和生成器的方式:流。pipe将可迭代的数据看成是流,类似于linux,pipe使用'|'传递数据流,并且定义了一系列的“流处理”函数用于接受并处理数据流,并最终再次输出数据流或者是将数据流归纳得到一个结果。我们来看一些例子。 第一个,非常简单的,使用add求和:
[u]复制代码[/u] 代码如下:
>>> from pipe import * >>> range(5) | add 10
求偶数和需要使用到where,作用类似于内建函数filter,过滤出符合条件的元素:
[u]复制代码[/u] 代码如下:
>>> range(5) | where(lambda x: x % 2 == 0) | add 6
还记得我们定义的斐波那契数列生成器吗?求出数列中所有小于10000的偶数和需要用到take_while,与itertools的同名函数有类似的功能,截取元素直到条件不成立:
[u]复制代码[/u] 代码如下:
>>> fib = fibonacci >>> fib() | where(lambda x: x % 2 == 0)\ ...       | take_while(lambda x: x < 10000)\ ...       | add 3382
需要对元素应用某个函数可以使用select,作用类似于内建函数map;需要得到一个列表,可以使用as_list:
[u]复制代码[/u] 代码如下:
>>> fib() | select(lambda x: x ** 2) | take_while(lambda x: x < 100) | as_list [1, 1, 4, 9, 25, 64]
pipe中还包括了更多的流处理函数。你甚至可以自己定义流处理函数,只需要定义一个生成器函数并加上修饰器Pipe。如下定义了一个获取元素直到索引不符合条件的流处理函数:
[u]复制代码[/u] 代码如下:
>>> @Pipe ... def take_while_idx(iterable, predicate): ...   for idx, x in enumerate(iterable): ...     if predicate(idx): yield x ...     else: return ...
使用这个流处理函数获取fib的前10个数字:
[u]复制代码[/u] 代码如下:
>>> fib() | take_while_idx(lambda x: x < 10) | as_list [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
更多的函数就不在这里介绍了,你可以查看pipe的源文件,总共600行不到的文件其中有300行是文档,文档中包含了大量的示例。 pipe实现起来非常简单,使用Pipe装饰器,将普通的生成器函数(或者返回迭代器的函数)代理在一个实现了__ror__方法的普通类实例上即可,但是这种思路真的很有趣。 函数式编程指南全文到这里就全部结束了,希望这一系列文章能给你带来帮助。希望大家都能看到一些结构式编程之外的编程方式,并且能够熟练地在恰当的地方使用 :) 明天我会整理一个目录放上来方便查看,并且列出一些供参考的文章。遗憾的是这些文章几乎都是英文的,请努力学习英语吧 - -#
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部