zoukankan      html  css  js  c++  java
  • 有趣的库:pipe(类似linux | 管道)库

    pipe并不是Python内置的库,如果你安装了easy_install,直接可以安装它,否则你需要自己下载它:http://pypi.python.org/pypi/pipe

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

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

    Python

    1

    2

    3

    >>> from pipe import *

    >>> range(5) | add

    10

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

    Python

    1

    2

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

    6

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

    Python

    1

    2

    3

    4

    5

    >>> fib = fibonacci

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

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

    ...       | add

    3382

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

    Python

    1

    2

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

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

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

    Python

    1

    2

    3

    4

    5

    6

    >>> @Pipe

    ... def take_while_idx(iterable, predicate):

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

    ...     if predicate(idx): yield x

    ...     else: return

    ...

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

    Python

    1

    2

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

    转的,至于from谁已经不得而知...

  • 相关阅读:
    括号配对问题 (栈的应用)
    poj 1363 火车进站 (栈的应用)
    算法训练题
    进制-Adding Two Negabinary Numbers
    翻转-Flip Columns For Maximum Number of Equal Rows
    图论-完全二叉树判定-Check Completeness of a Binary Tree
    动态规划-Maximum Subarray-Maximum Sum Circular Subarray
    贪心-最大相容区间-Maximum Number of Events That Can Be Attended
    动态规划-LCS-Uncrossed Lines
    数学-绝对值-Reverse Subarray To Maximize Array Value
  • 原文地址:https://www.cnblogs.com/Vito2008/p/pypipe.html
Copyright © 2011-2022 走看看