python pipe_python pipe模块用法
pipe并不是Python內置的庫,如果你安裝了easy_install,直接可以安裝它,否則你需要自己下載它:http://pypi.python.org/pypi/pipe
之所以要介紹這個庫,是因為它向我們展示了一種很有新意的使用迭代器和生成器的方式:流。pipe將可迭代的數據看成是流,類似于linux,pipe使用'|'傳遞數據流,并且定義了一系列的“流處理”函數用于接受并處理數據流,并最終再次輸出數據流或者是將數據流歸納得到一個結果。我們來看一些例子。
第一個,非常簡單的,使用add求和:
[python]
>>> from pipe import *
>>> range(5) | add
10
求偶數和需要使用到where,作用類似于內建函數filter,過濾出符合條件的元素:
[python]
>>> range(5) | where(lambda x: x % 2 == 0) | add
6
還記得我們定義的斐波那契數列生成器嗎?求出數列中所有小于10000的偶數和需要用到take_while,與itertools的同名函數有類似的功能,截取元素直到條件不成立:
def fibonacci():
a=b=1
yield a
yield b
while True:
a, b = b, a+b
yield b
[python]>>> fib = fibonacci
>>> fib() | where(lambda x: x % 2 == 0)
... | take_while(lambda x: x < 10000)
... | add
3382
需要對元素應用某個函數可以使用select,作用類似于內建函數map;需要得到一個列表,可以使用as_list:
[python]
>>> fib() | select(lambda x: x ** 2) | take_while(lambda x: x < 100) | as_list
[1, 1, 4, 9, 25, 64]
pipe中還包括了更多的流處理函數。你甚至可以自己定義流處理函數,只需要定義一個生成器函數并加上修飾器Pipe。如下定義了一個獲取元素直到索引不符合條件的流處理函數:
[python]
>>> @Pipe
... def take_while_idx(iterable, predicate):
... for idx, x in enumerate(iterable):
... if predicate(idx): yield x
... else: return
...
使用這個流處理函數獲取fib的前10個數字:
[python]
>>> 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__方法的普通類實例上即可,但是這種思路真的很有趣。
一道面試題:
讀取文件,統計文件中每個單詞出現的次數,然后按照次數高低排序。
本來蠻平淡無奇的一題,但一跟剛剛介紹的 Pipe 結合起來,就有意思了,這類數據流的處理,相當適合用 Pipe 來處理,花了點時間,寫代碼如下:
[('request', 91), ('POST', 81), ('and', 38), ('u', 36), ('if', 33),
('in', 32), ('team', 29), ('line', 23), ('objects', 20), ('gcmgroups',
16), ('get', 14), ('import', 14), ('save', 13), ('str', 12), ('0', 11),
('1', 11), ('i', 11), ('False', 10), ('GcwGroups', 9), ('from', 9),
('group_name', 9), ('path', 9), ('team_groups', 9), ('add', 8), ('else',
8), ('extra_context', 8), ('form2', 8), ('return', 8), ('Area', 7),
('baoming', 7), ('cname', 7), ('cname1', 7), ('cname2', 7), ('form1',
7), ('mysql_cur',
7), ('8', 6), ('gender', 6), ('is_del', 6), ('time', 6), ('user', 6),
('20', 5), ('7', 5), ('def', 5), ('depth', 5), ('for', 5), ('gcwteam',
5), ('radio1', 5), ('13', 4), ('16', 4), ('2', 4), ('2013', 4), ('5',
4)]
總結
以上是生活随笔為你收集整理的python pipe_python pipe模块用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web前端基础案例-开发QQ空间旋转时光
- 下一篇: 云服务总线CSB