Pipe Python 的中綴語法庫

2021-08-25 18:44:04 字數 1985 閱讀 9348

賴勇浩(

通過 pipe 模組,就能夠使用 python 用上中綴語法。

首先來看一下傳統字首語法的**:

sum(select(where(take_while(fib(), lambda x: x < 1000000) lambda x: x % 2), lambda x: x * x))

很難讀?再來看看中綴語法**:

fib() | take_while(lambda x: x < 1000000) | where(lambda x: x % 2) | select(lambda x: x * x) | sum()

好讀多了吧?

雖然 pipe 基類的**很少,但很強大,能夠讓你很容易寫出 pipeable 函式哦。而且這個模組本身就帶了超過 30 個已經寫好的函式,比如 『where』, 『group_by』, 『sort』, 『take_while』 …

如果想一下 pipe,需要先安裝,在命令列執行:

easy_install -u pipe

然後等著安裝完成就行了。現在可以開啟乙個互動式 shell,來試一下:

>>> from pipe import *>>> [1, 2, 3, 4, 5] | add15>>> [5, 4, 3, 2, 1] | sort[1, 2, 3, 4, 5]

很簡單吧?如果有什麼問題,可以隨時 help(pipe) 一下,就可以看到完備的幫助了。

>>> [1, 2, 3, 4, 5] | where(lambda x: x % 2) | concat'1, 3, 5'>>> [1, 2, 3, 4, 5] | where(lambda x: x % 2) | tail(2) | concat'3, 5'>>> [1, 2, 3, 4, 5] | where(lambda x: x % 2) | tail(2) | select(lambda x: x * x) | concat'9, 25'>>> [1, 2, 3, 4, 5] | where(lambda x: x % 2) | tail(2) | select(lambda x: x * x) | add34

因為 pipe 是惰性求值的,所以我們完成可以弄乙個無窮生成器而不用擔心記憶體用完,比如:

>>> def fib():... x = 1... yield 1... y = 1... yield 1... while true:... x = x + y... yield x... y = x + y... yield y

現在讓我們用 fib() 函式來完成乙個 的第 2 題:

find the sum of all the even-valued terms in fibonacci which do not exceed four million.

>>> euler2 = fib() | where(lambda x: x % 2 == 0) | take_while(lambda x: x < 4000000) | add>>> assert euler2 == 4613732

怎麼樣?可讀性強吧?漂亮不?

最後,我們來學習一下如何利用 @pipe decorator 建立乙個新的 pipeable 函式:

假定要建立乙個函式 yield 它的輸入的前 x 個元素

假定要建立乙個函式能夠用以 (1, 2, 3, 4, 5) | take(2) 語句來獲取前兩個元素

那麼最初的實現可能是這樣的:

def take(iterable, qte): for item in iterable: if qte > 0: qte -= 1 yield item else: return

現在,你只要把 @pipe 蓋在這個函式上頭,這貨就是 pipeable 函式了!

鳴謝:感謝 @yinhm 在 twitter 上分享《pipe: infix syntax for python》一文,讓我知道還有這等神器。

感謝 @kyhpudding 在 twitter 上分享他的 solo 模組,乙個比 pipe 更奇幻的模組,希望我能理解清楚,能夠跟大家介紹之。

中綴到字尾的轉換

我們平常所寫的標準形式的表示式叫做中綴式,我們可以用棧來把他轉換成字尾式。假設只允許操作 並堅持普通的優先順序發則。還要假設表示式是合法的。如將表示式 a b c d e f g轉換成字尾式是a b c d e f g 思路 當讀到乙個運算元時,立即把他放到輸出中。而把操作符放進乙個棧中。當遇到左括...

棧的應用 中綴變字尾

中綴表示式 運算符號在數字中間 字尾表示式 運算符號在數字之後 計算機計算計算的是字尾表示式 中綴變字尾舉例 5 3 5 3 1 2 3 1 2 3 9 3 1 5 9 3 1 5 中綴變字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 符號 與棧頂符號進行優先順...

中綴表示式的值

總時間限制 200ms 記憶體限制 1024kb 描述 人們熟悉的四則運算表示式稱為中綴表示式,例如 23 34 45 5 6 7 在程式語言中,可以利用堆疊的方法把中綴表示式轉換成保值的字尾表示式 又稱逆波蘭表示法 並最終變為計算機可以直接執行的指令,得到表示式的值。給定乙個中綴表示式,編寫程式,...