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誰已經不得而知...
新聞熱點
疑難解答