Python中一个有趣的库:pipe

发布时间:2022-04-20 09:55:38 人气:89 作者:多测师

  这一节里我要向诸位简要介绍pipe。pipe并不是Python内置的库,如果你安装了easy_install,直接可以安装它,否则你需要自己下载它:http://pypi.python.org/pypi/pipe

  之所以要介绍这个库,是因为它向我们展示了一种很有新意的使用迭代器和生成器的方式:流。pipe将可迭代的数据看成是流,类似于linux,pipe使用'|'传递数据流,并且定义了一系列的“流处理”函数用于接受并处理数据流,并最终再次输出数据流或者是将数据流归纳得到一个结果。我们来看一些例子。

  第一个,非常简单的,使用add求和:

  >>> from pipe import *

  >>> range(5) | add

  求偶数和需要使用到where,作用类似于内建函数filter,过滤出符合条件的元素:

  2>>> range(5) | where(lambda x: x % 2 == 0) | add

  还记得我们定义的斐波那契数列生成器吗?求出数列中所有小于10000的偶数和需要用到take_while,与itertools的同名函数有类似的功能,截取元素直到条件不成立:

Python中一个有趣的库:pipe

  5>>> fib = fibonacci

  >>> fib() | where(lambda x: x % 2 == 0)\

  ... | take_while(lambda x: x < 10000)\

  ... | add

  3382

  需要对元素应用某个函数可以使用select,作用类似于内建函数map;需要得到一个列表,可以使用as_list:

  >>> fib() | select(lambda x: x ** 2) | take_while(lambda x: x < 100) | as_list

  [1, 1, 4, 9, 25, 64]

  pipe中还包括了更多的流处理函数。你甚至可以自己定义流处理函数,只需要定义一个生成器函数并加上修饰器Pipe。如下定义了一个获取元素直到索引不符合条件的流处理函数:

  >>> @Pipe

  ... def take_while_idx(iterable, predicate):

  ... for idx, x in enumerate(iterable):

  ... if predicate(idx): yield x

  ... else: return

  ...

  使用这个流处理函数获取fib的前10个数字:

  >>> 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__方法的普通类实例上即可,但是这种思路真的很有趣。

  以上内容为大家介绍了Python中一个有趣的库:pipe,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/xwzx/


返回列表
在线客服
联系方式

热线电话

17727591462

上班时间

周一到周五

二维码
线