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