函式:function
函式式:functional,一種程式設計正規化
函式式程式設計的特點:
①把計算視為函式而非指令
②純函式式程式設計:不需要變數,沒有***,測試簡單
③支援高階函式,**簡潔
python支援的函式式程式設計特點:
①不是純函式式程式設計,因為python允許有變數
②支援高階函式:函式也可以作為變數傳入
③支援閉包:有了閉包就能返回函式
④有限度的支援匿名函式
高階函式:能接收函式作為引數的函式
因為:變數可以指向函式,而函式的引數可以接收變數,所以乙個函式可以接收另外乙個函式作為引數。
變數可以指向函式,在這裡變數f指向abs函式,呼叫f()和abs()原函式的效果是一致的
print(abs(-10))變數名其實就是指向函式的變數f=abs
print(f(-10))
print(f)如果將abs變數指向len,那麼再用abs求絕對值,會報錯print(abs)
abs=lenprint(abs(-10))
typeerror: object of type 'int' has no len()
print(abs('222'))3
定義乙個函式可以接收x,y,f三個引數,其中x,y為數值,f為函式
deffunction1(x,y,f):20print(f(x)+f(y))
function1(-10,10,abs)
map()是 python 內建的高階函式,它接收乙個函式 f 和乙個 list,並通過輸出結果:把函式 f 依次作用在 list 的每個元素上
,得到乙個新的 list 並返回。
例如,對於list [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果希望把list的每個元素都作平方,就可以用map()函式:
因此,我們只需要傳入函式f(x)=x*x,就可以利用map()函式完成這個計算:
def f(x):
return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 10, 25, 36, 49, 64, 81]注意:
map()函式不改變原有的 list,而是返回乙個新的 list
。 利用map()函式,可以把乙個 list 轉換為另乙個 list,只需要傳入轉換函式。
由於list包含的元素可以是任何型別,因此,map() 不僅僅可以處理只包含數值的 list,事實上它可以處理包含任意型別的 list,只要傳入的函式f可以處理
這種資料型別。
defformat_name(s):returns[0].upper()+s[1:].lower()
print(list(map(format_name, ['adam','lisa','bart'])))
['adam', 'lisa', 'bart']reduce()函式也是python內建的乙個高階函式。reduce()函式接收的引數和 map()類似,乙個函式 f,乙個list,但行為和 map()不同,
reduce()
傳入的函式 f
必須接收兩個引數
,reduce()對list的每個元素反覆呼叫函式f,並返回最終結果值。
例如,編寫乙個f函式,接收x和y,返回x和y的和:
def f(x, y):呼叫 reduce(f, [1, 3, 5, 7, 9])時,reduce函式將做如下計算:return x + y
先計算頭兩個元素:f(1, 3),結果為4;上述計算實際上是對 list 的所有元素求和。雖然python內建了求和函式sum(),但是,利用reduce()求和也很簡單。再把結果和第3個元素計算:f(4, 5),結果為9;
再把結果和第4個元素計算:f(9, 7),結果為16;
再把結果和第5個元素計算:f(16, 9),結果為25;
由於沒有更多的元素了,計算結束,返回結果25。
reduce()還可以接收第3個可選引數,作為計算的初始值
。如果把初始值設為100,計算:
reduce(f, [1, 3, 5, 7, 9], 100)結果將變為125,因為第一輪計算是:
計算初始值和第乙個元素:f(100, 1),結果為101。
filter()函式是 python 內建的另乙個有用的高階函式,filter()函式接收乙個函式 f 和乙個list,
這個函式 f 的作用是對每個元素
進行判斷,返回 true或 false
,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
例如,要從乙個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數,保留奇數,首先,要編寫乙個判斷奇數的函式:
def is_odd(x):然後,利用filter()過濾掉偶數:return x % 2 == 1
filter(is_odd, [1, 4, 6, 7, 9, 12, 17])結果:[1, 7, 9, 17]
利用filter(),可以完成很多有用的功能,例如,刪除 none 或者空字串:
def is_not_empty(s):結果:['test', 'str', 'end']return s and len(s.strip()) > 0
filter(is_not_empty, ['test', none, '', 'str', ' ', 'end'])
注意: s.strip(rm) 刪除 s 字串中開頭、結尾處的 rm 序列的字元。
當rm為空時,預設刪除空白符(包括'\n', '\r', '\t', ' '),如下:
a = ' 123'結果: '123'a.strip()
a='\t\t123\r\n'結果:a.strip()
'123'
python內建的
sorted()
函式可對list進行排序:
>>>sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
但 sorted()也是乙個高階函式,它可以接收乙個比較函式來實現自定義排序,比較函式的定義是,傳入兩個待比較的元素 x, y,如果 x 應該排在 y 的前面,返回 -1,如果 x 應該排在 y 的後面,返回 1。如果 x 和 y 相等,返回 0。
因此,如果我們要實現倒序排序,只需要編寫乙個reversed_cmp函式:
def reversed_cmp(x, y):這樣,呼叫 sorted() 並傳入 reversed_cmp 就可以實現倒序排序:if x > y:
return -1
if x < y:
return 1
return 0
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)sorted()也可以對字串進行排序,字串預設按照ascii大小來比較:[36, 21, 12, 9, 5]
>>> sorted(['bob', 'about', 'zoo', 'credit'])'zoo'排在'about'之前是因為'z'的ascii碼比'a'小。['credit', 'zoo', 'about', 'bob']
sorted()函式 在python2.x 和 python3.x 中有所不同
## sorted()函式 在python2.x 和 python3.x 中有所不同:
sorted
(iterable,
cmp
=
none
, key
=
none
, reverse
=
false
)
## python 2.x
sorted
(iterable, key
=
none
, reverse
=
false
)
## python 3.x
## 由此可看出, python 3.x 取消了 cmp 引數, 所以如果想給 sorted()函式傳參的話, 就剩下 key, 和reverse了,
## 其中,reverse 就是返回 正常排序的反序,
python中的函式式程式設計
python內建了map 和reduce 函式 map map 函式接收兩個引數,乙個是函式,乙個是iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的iterator返回 def f x return x x r map f,1,2,3,4,5 print list r ...
python中函式和函式式程式設計
def funx x,y,z print x,y,z funx 1,hello true 位置引數 funx z he y is x boy 關鍵字引數執行結果 f untitled2 venv scripts python.exe f untitled2 chinese demo1.py 1 he...
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...