有趣的库:pipe(类似linux | 管道)库
?
pipe并不是Python內(nèi)置的庫,如果你安裝了easy_install,直接可以安裝它,否則你需要自己下載它:http://pypi.python.org/pypi/pipe
之所以要介紹這個庫,是因為它向我們展示了一種很有新意的使用迭代器和生成器的方式:流。pipe將可迭代的數(shù)據(jù)看成是流,類似于linux,pipe使用’|'傳遞數(shù)據(jù)流,并且定義了一系列的“流處理”函數(shù)用于接受并處理數(shù)據(jù)流,并最終再次輸出數(shù)據(jù)流或者是將數(shù)據(jù)流歸納得到一個結(jié)果。我們來看一些例子。
第一個,非常簡單的,使用add求和:
Python
| 1 2 3 | >>> from pipe import * >>> range(5) | add 10 |
求偶數(shù)和需要使用到where,作用類似于內(nèi)建函數(shù)filter,過濾出符合條件的元素:
Python
| 1 2 | >>> range(5) | where(lambda x: x % 2 == 0) | add 6 |
還記得我們定義的斐波那契數(shù)列生成器嗎?求出數(shù)列中所有小于10000的偶數(shù)和需要用到take_while,與itertools的同名函數(shù)有類似的功能,截取元素直到條件不成立:
Python
| 1 2 3 4 5 | >>> fib = fibonacci >>> fib() | where(lambda x: x % 2 == 0)\ ...?????? | take_while(lambda x: x < 10000)\ ...?????? | add 3382 |
需要對元素應(yīng)用某個函數(shù)可以使用select,作用類似于內(nèi)建函數(shù)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中還包括了更多的流處理函數(shù)。你甚至可以自己定義流處理函數(shù),只需要定義一個生成器函數(shù)并加上修飾器Pipe。如下定義了一個獲取元素直到索引不符合條件的流處理函數(shù):
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 ... |
使用這個流處理函數(shù)獲取fib的前10個數(shù)字:
Python
| 1 2 | >>> fib() | take_while_idx(lambda x: x < 10) | as_list [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] |
更多的函數(shù)就不在這里介紹了,你可以查看pipe的源文件,總共600行不到的文件其中有300行是文檔,文檔中包含了大量的示例。
pipe實現(xiàn)起來非常簡單,使用Pipe裝飾器,將普通的生成器函數(shù)(或者返回迭代器的函數(shù))代理在一個實現(xiàn)了__ror__方法的普通類實例上即可,但是這種思路真的很有趣。
轉(zhuǎn)的,至于from誰已經(jīng)不得而知...
轉(zhuǎn)載于:https://www.cnblogs.com/Vito2008/p/pypipe.html
總結(jié)
以上是生活随笔為你收集整理的有趣的库:pipe(类似linux | 管道)库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [JavaWeb基础] 025.JAVA
- 下一篇: Palindrome Partition