簡介Python版本選擇
本文對Python的版本選擇,IDE選擇及編碼的解決方案進行了一番詳細的描述,實為Python初學者必讀的Python學習經驗心得,一種方式是主程序使用一門高級語言,比如C++進行編寫,然后對其嵌入一個腳本解釋器,在運行時動態執行一些腳本函數;
但正如我們可以使用數字 23 而無需將它與任何名稱綁定一樣(換句話說,象函數自變量一樣),我們可以使用用 lambda 創建的函數對象而不用將它與任何名稱綁定。一個函數只是我們在 Python 中對其執行某些操作的另一個值。
我們對第一類對象所執行的主要操作是將它們傳遞給 FP 內置函數 map()、reduce() 和 filter()。這些函數中的每一個都接受函數對象作為其第一個自變量。 map() 對指定列表中每個對應的項執行傳遞的函數,并返回結果列表。
reduce() 對每個后續項執行傳遞的函數,返回的是最終結果的內部累加;例如 reduce(lambda n,m:n*m, range(1,10)) 意味著“10 的階乘”(換句話說,用每一項乘上前一次相乘的乘積)。 #t#
filter() 使用傳遞的函數對列表中的每一項“求值”,然后返回經過甄別的,通過了傳遞函數測試的項的列表。 我們還經常將函數對象傳遞給自己的定制函數,但它們通常等同于上述內置函數的組合。
通過將這三種 FP 內置函數進行組合,可以執行驚人的一系列“流”操作(都不使用語句,而只使用表達式)。 Python 中的函數循環 替換循環與替換條件塊一樣簡單。
for 可以直接轉換成 map()。對于我們的條件執行,我們需要將語句塊簡化成單一函數調用(我們正逐步接近通常的做法):while 的轉換仍需要 while_block() 函數,它本身包含語句而不僅僅是表達式。但我們需要對該函數做進一步的消除(例如對模板中的 if/else 進行短路)。
另外,因為循環主體(按設計)無法更改任何變量值,所以 <cond> 很難用在一般的測試中,例如 while myvar==7(那么,將在 while_block() 中修改全部內容)。添加更有用條件的一個方法是讓 while_block() 返回一個更有趣的值,然后將這個返回值與終止條件進行比較。有必要看一下這些消除語句的具體示例:
- # imperative version of "echo()"
- def echo_IMP():
- while 1:
- x = raw_input("IMP -- ")
- if x == 'quit':
- break
- else
- print x
- echo_IMP()
- # utility function for "identity with side-effect"
- def monadic_print(x):
- print x
- return x
- # FP version of "echo()"
- echo_FP = lambda: monadic_print(raw_input("FP -- "))=='quit' or echo_FP()
- echo_FP()
我們所完成的是設法將涉及 I/O、循環和條件語句的小程序表示成一個帶有遞歸的純表達式(實際上,如果需要,可以表示成能傳遞到任何其它地方的函數對象)。我們的確仍然利用了實用程序函數 monadic_print(),但這個函數是完全一般性的,可以在我們以后創建的每個函數程序表達式中重用(它是一次性成本)。
請注意,任何包含 monadic_print(x) 的表達式所求值的結果都是相同的,就象它只包含 x 一樣。FP(特別是 Haskell)對于“不執行任何操作,在進程中有副作用”的函數具有“單一體”意思。
【編輯推薦】