有關(guān)Python代碼學(xué)習(xí)介紹
在學(xué)習(xí)研究Python代碼之前,我們先要了解下什么是Python,所謂的Python就是一種面向?qū)ο蟆⒅弊g式計算機(jī)程序設(shè)計語言,也是一種功能強(qiáng)大而完善的通用型語言,已經(jīng)具有十多年的發(fā)展歷史。
在除去***的、有意義的語句不用而代之以晦澀的、嵌套的表達(dá)式的工作后,一個很自然的問題是:“為什么?!”我對 FP 的所有描述都是使用 Python 做到的。但最重要的特性 -- 可能也是具體情況中最有用的特性 -- 是它消除了副作用(或者至少對一些特殊領(lǐng)域,例如單一體,有一些牽制作用)。
絕大部分程序錯誤 -- 和促使程序員求助于調(diào)試來解決的問題 -- 之所以會發(fā)生,是因為在程序執(zhí)行過程期間,變量包含了意外的值。函數(shù)程序只不過根本就不為變量分配值,從而避免了這一特殊問題。
讓我們看一段相當(dāng)普通的命令Python代碼。它的目的是打印出乘積大于 25 的幾對數(shù)字的列表。組成各對的數(shù)字本身是從另外兩個列表中挑選出的。這種操作與程序員在他們程序段中實際執(zhí)行的操作差不多。實現(xià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()
這個項目太小,以至于沒有什么可能出錯。但我們的目的可能嵌在要同時實現(xiàn)許多其它目的的代碼中。用 "more stuff" 注釋的那些部分是副作用可能導(dǎo)致錯誤發(fā)生的地方。
在這些地方中的任何一處,變量 xs、ys、bigmuls、x、y 有可能獲得假設(shè)節(jié)略代碼中的意外值。而且,在執(zhí)行完這一段代碼后,所有變量都可能具有稍后代碼可能需要也可能不需要的一些值。
很明顯,可以使用函數(shù)/實例形式的封裝和有關(guān)作用域的考慮來防止出現(xiàn)這種類型的錯誤。而且,您總是可以在執(zhí)行完變量后 del 它們。但在實際中,這些指出類型的錯誤非常普遍。
目標(biāo)的函數(shù)方法完全消除了這些副作用錯誤。以下是可能的一段Python代碼:
- # 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()
在示例中,我們將匿名 (lambda) 函數(shù)對象與名稱進(jìn)行綁定,但這不是一定必要的。我們可以只嵌套定義。這樣做是出于可讀性目的;但也是因為 combine() 是一種隨處可得的很好實用程序函數(shù)(從兩個輸入列表中產(chǎn)生所有元素對的列表)。
隨后的 dupelms() 主要只是幫助 combine() 發(fā)揮作用的一種方法。即使這一函數(shù)示例比命令示例更冗長,但一旦考慮到實用程序函數(shù)可以重用,那么 bigmuls() 中的新代碼本身可能比命令版本中的Python代碼數(shù)量還要少一些。
【編輯推薦】