從小老師教程式語言就告訴分兩種:面向過程和物件導向,正如同小學電腦課面對的是win95,彷彿世界上windows就是作業系統的別名,如今還是這樣,高校的計算機中心都是windows,所以linux是要自己搞起,函式式程式設計也是要自己搞起的~不為學分不為獎學金不為工資只是追隨著自己的興趣,這才是最開心的哈~
python有一大優點,就是既可以物件導向也可以面向過程還可以函式式搞起,因此想體驗函式式程式設計的樂趣不用換erlangh或scheme。函式式程式設計的特點:
1. 變數不可變;
2. 閉包性;
按照函式式程式設計的特點,乙個函式只接受輸入並產生輸出,不會改變外部變數的值也不會用到外部變數的值。也正因為這樣,函式式程式設計乙個函式只做一件事兒,方便模組化,而且**量要少一些。
1.lambda
lambda是匿名函式,沒有函式名,在閉包裡和map reduce中很好用。下面是求兩數乘積的函式:
>>>func=lambda x,y:x*y
>>>func(3,4)
12
2.map
map函式是對乙個序列的每個項依次執行函式,下面是對乙個序列每個項都乘以2:
>>> a=map(lambda x:x*2,[1,2,3])
>>> list(a)
[2, 4, 6]
3.reduce
reduce函式是對乙個序列的每個項迭代呼叫函式,下面是求3的階乘:
>>> functools.reduce(lambda x,y:x*y,range(1,4))
6
好了,這就是python函式式程式設計常用的幾個函式,現在用乙個求n的階乘的例子對比一下函式式程式設計和面向過程的程式設計的區別:
>>> def func(n):
... if n==1:
... return 1
... return n*func(n-1)
...
>>> func(4)
24>>> g=lambda n:functools.reduce(lambda x,y:x*y,range(1,n+1))
>>> g(4)
24
非常簡潔乾淨~然後再看一下函式式程式設計的閉包:
>>> def funa():
... x=0
... def funb():
... nonlocal x
... x+=1
... print(x)
... return funb
...
>>> a=funa()
>>> a()
1>>> a()
2>>> a()
3
閉包就是函式中又定義函式,裡面的函式可以使用外部作用域內的變數,但不是全域性變數,所以一次建立外部函式,則多次呼叫內部函式時外部作用域內的變數還是有效的;多次執行外部函式,則會重新建立閉包,原來外部變數的值也不會受到影響,如上例可以實現每次呼叫內部函式是的外部變數+1操作。這裡說一下作用域的事兒,原來的python2只有全域性作用域和區域性作用域,python3新增的nonlocal作用域就是專門針對閉包的,nonlocal宣告的變數只能訪問外部作用域的變數,不能訪問全域性作用域的變數,這樣就不用全域性變數搞來搞去錯都不知道**出的了。
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...
Python列表推導式玩法
列表做為python的基礎,是必須學習的語法之一。一些基礎的之前已經是反覆溫習和使用了,今天我們來學習它的高階版 列表推導式。列表推導式 i for i in iterable if expression 首先使用常用的for迴圈實現 下面請出列表推導式 要生成的元組如下 0,1,0,0,0,0,0...
python的函式式程式設計
一 高階函式 即函式的引數能接收別的函式 def add x,y,f return f x f y print add 5,6,abs 11內建函式 filter 函式 用於過濾序列 接受乙個函式與乙個序列 filter 的作用是從乙個序列中篩出符合條件的元素。由於filter 使用了惰性計算,所以...