當前位置:
首頁 > 知識 > Python鏈式操作:PyFunctional

Python鏈式操作:PyFunctional

Python鏈式操作:PyFunctional

Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。

特性

PyFunctional通過使用鏈式功能操作符使得創建數據管道變得簡單。以下是pyfunctional及其內置工具可以做什麼的幾個例子:

● 鏈式運算符:seq(1, 2, 3).map(lambda x: x * 2).reduce(lambda x, y: x + y)

● 易表達且功能完整的API

● 讀寫 text, csv, json, jsonl, sqlite, gzip, bz2和lzma/xz文件

● 並行化「embarrassingly parallel」操作像map一樣方便

● 完整的文檔,嚴格的單元測試套件,100%的測試覆蓋率,以及提供健壯性的CI

pyfunctional API的靈感來自於Scala集合,Apache Spark RDDS,和微軟的LINQ。

安裝

在pypi上可以獲得PyFunctional並且可以通過運行以下命令安裝:

Python鏈式操作:PyFunctional

然後在python上運行:from functional import seq

示例

PyFunctional對許多任務有用,並可以打開幾種常見的文件類型。以下是你能做的一些例子。

簡單的例子

Python鏈式操作:PyFunctional

流、轉換和動作

PyFunctional有三種類型的功能:

1、流:讀取數據以供集合API使用。

2、轉換:使用諸如map, flat_map和filter之類的函數從流中轉換數據。

3、動作:引起一系列的轉變來求一個具體的值。to_list,reduce和to_dict是動作的例子。

在表達式seq(1, 2, 3).map(lambda x: x * 2).reduce(lambda x, y: x + y)中,seq是流,map是變換,而reduce是動作。

過濾賬戶交易列表

Python鏈式操作:PyFunctional

字數統計和連接

賬戶交易示例可以使用列表解析用純Python輕鬆完成。為了展示PyFunctional擅長的一些事情,請看一下幾個字數統計的例子。

Python鏈式操作:PyFunctional

在下一示例中,我們使用包含消息和元數據的json(jsonl)格式的聊天記錄。一個典型的jsonl文件每行上有一個有效的json。以下是examples/chat_logs.jsonl中的幾行。

Python鏈式操作:PyFunctional

Python鏈式操作:PyFunctional

接下來,讓我們繼續這個例子,但是從examples/users.json引入一個用戶的json資料庫。在前面的例子中,我們展示了PyFunctional如何進行字數統計,下一個例子中展示PyFunctional如何加入不同的數據源。

Python鏈式操作:PyFunctional

CSV,聚合函數,和集合函數

在examples/camping_purchases.csv中有一個露營購物列表。讓我們做一些成本分析,並比較存儲在examples/gear_list.txt所需的野營裝備列表。

Python鏈式操作:PyFunctional

除了上面顯示的聚合函數(sum和max_by)之外,還有更多。同樣地,除了difference之外,還有一些集合函數。

讀/寫SQLite3

PyFunctional可以讀取和寫入SQLite3資料庫文件。在下面的示例中,從中examples/users.db讀取用戶,將其列id:Int和name:String作為行存儲。

Python鏈式操作:PyFunctional

寫入SQLite3資料庫同樣簡單

Python鏈式操作:PyFunctional

寫入文件

就像PyFunctional可以從csv, json, jsonl, sqlite3和text文件讀取一樣,也可以寫入它們。有關完整的API文檔,請參閱集合API表或者官方文檔。

壓縮文件

PyFunctional將自動檢測用gzip, lzma/xz和bz2壓縮的文件。這是通過檢查文件的前幾個位元組來確定它是否被壓縮,因此不需要修改代碼來工作。

要編寫壓縮文件,每個to_函數都有一個參數compression,可以將其設置為默認None用於無壓縮,gzip或gz用於gzip壓縮,lzma或xz用於lzma壓縮和bz2用於bz2壓縮。

並行執行

啟用並行性所需的唯一更改是導入from functional import pseq而不是from functional import seq,而且使用seq的地方使用pseq。以下操作並行運行,在將來的版本中將實現更多的操作:

● map/select

● filter/filter_not/where

● flat_map

並行化使用Python multiprocessing和embarrassingly parallel操作鏈,來降低間接成本。例如,一系列映射和過濾器將一次執行,而不是使用multiprocessing在多循環中執行。

文檔

下面是簡明的文檔,完整的文檔位於docs.pyfunctional.org。

Streams API

所有的PyFunctional流都可以通過seq對象來訪問。創建一個流的主要方法是通過調用一個可迭代的seq。可調用的seq是靈活的,可以接受多種類型的參數,如下面的例子所示。

Python鏈式操作:PyFunctional

seq還提供了進入其他流的屬性函數,如下所示。

Python鏈式操作:PyFunctional

有關這些函數可以使用的參數的更多信息,請參考流文檔。

轉換和動作API

下面是seq的流對象可以調用的函數的完整列表。有關完整的文檔參考轉換和操作API。

Python鏈式操作:PyFunctional

Python鏈式操作:PyFunctional

Python鏈式操作:PyFunctional

Python鏈式操作:PyFunctional

Python鏈式操作:PyFunctional

Python鏈式操作:PyFunctional

Python鏈式操作:PyFunctional

延遲執行

只要有可能,PyFunctional將延遲計算。這是通過跟蹤已經應用到序列的轉換列表來完成的,並且只有在一個動作被調用時才對它們進行求值。在PyFunctional中,這被稱為跟蹤譜系。這也是PyFunctional緩存計算結果的能力,以防止昂貴的重新計算。這主要是為了保持明智的行為,並謹慎使用。 例如,調用size將緩存基礎序列。 如果這沒有完成,並且輸入是一個迭代器,那麼進一步的調用將在一個已到期的迭代器上運行,因為它被用來計算長度。 類似地, repr也是緩存的,因為它在互動式會話中經常使用, 而互動式對話中不希望重新計算相同的值。 以下是一些檢查譜系的例子。

Python鏈式操作:PyFunctional

如果通過seq.open和相關API打開文件,則會給予特殊處理。 functional.util.ReusableFile實現了標準python文件的包裝,以支持在單個文件對象上的多次迭代,同時正確處理迭代終止和文件關閉。

路線圖的想法

● 基於SQL的查詢計劃器和解釋器

● _ lambda運算符

● 準備1.0下一版本

貢獻和錯誤修復

任何貢獻或錯誤報告都是受歡迎的。 到目前為止,pull請求的接受率為100%,貢獻者對代碼提供了有價值的反饋和評論。 聽到這個軟體包的用戶,特別是它的用途,運行良好,和還有什麼可以改進,真是太棒了。

如果你也想做出貢獻,創建一個PyFunctional的分支 ,進行更改,然後確保它們在TravisCI上運行時通過 (您可能需要註冊一個帳戶並鏈接Github)。 為了合併,所有的pull請求必須:

● 通過所有的單元測試

● 通過所有的pylint測試,或者忽略警告並解釋為什它這樣做是正確的

● 在coveralls.io上實現100%的測試覆蓋率。

● 編輯CHANGELOG.md文件

聯繫

Gitter聊天

支持的Python版本

PyFunctional支持Python 2.7, 3.3, 3.4.4, 3.5和PyPy

更新日誌

更新日誌

關於我

關於我(作者)要了解更多,請訪問我的網頁pedrorodriguez.io。

我是科羅拉多大學博爾德分校計算機科學博士研究生。 我的研究興趣包括大型機器學習,分散式計算和相鄰領域。 在2015年,我在加州大學伯克利分校完成了計算機科學本科學位。之前我曾在Apache Berkeley的加州大學伯克利分校進行過研究,曾在Trulia擔任數據科學家,今年夏天將擔任Oracle Data Cloud的數據科學家。

我在Trulia時廣泛使用Python,並且發現我想念Spark RDD和Scala集合操縱數據的易用性,創建了PyFunctional。當Scala不是一個選項或者PySpark過於複雜時,該項目從這些API和LINQ得到最好的想法來提供一個簡單的方法來操作數據。

貢獻者

這些人慷慨地貢獻了他們的時間來改進PyFunctional

● versae

● adrian17

● lucidfrontier45

● Digenis

● ChuyuHsu

英文原文:http://www.pyfunctional.org/
譯者:張新英

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

2018 年學習 Python 的理由

TAG:Python部落 |