百科定義:
函式式程式設計是種程式設計方式,它將電腦運算視為函式的計算。函式程式語言最重要的基礎是λ演算(lambda calculus),而且λ演算的函式可以接受函式當作輸入(引數)和輸出(返回值)。我理解起來,這句話的意思就是,將乙個個函式視為最小的運算單元,不關心中間的過程,而重在最後的輸出,對於同樣的輸入,必定有同樣的輸出,不依賴周圍環境,不改變其它變數或者狀態。
這裡的函式指的是數學意義上的函式:
給定乙個數集a,對a施加對應法則f,記作f(a),得到另一數集b,也就是b=f(a)。與其相對應的概念是命令式程式設計(imperative programming)和宣告式程式設計(declarative programming),主要區別可以參考這裡。那麼這個關係式就叫函式關係式,簡稱函式。函式概念含有三個要素:定義域a、值域c和對應法則f。其中核心是對應法則f,它是函式關係的本質特徵。
變數可以指向函式
>>
>
abs(-10
)10>>
>
absin function abs
>
>>
> f =
abs>>
> f(-10
)10
函式名後加圓括號表示對函式的呼叫,不加圓括號則返回函式本身。可以將函式本身賦值給乙個變數f,此時f就等同於abs函式本身,因此對f的呼叫與對abs的呼叫便有著相同的效果。
函式名也是變數
>>
>
abs(-10
)10>>
>
abs=
'f'>>
>
abs(-10
)traceback (most recent call last)
: file ""
, line 1,in
typeerror:
'str'
object
isnot
callable
abs雖然一開始是內建函式名,但仍可以給其賦新的值,此時新值則將對應的函式覆蓋。可以理解為abs是乙個變數名,初始時這個變數名指向絕對值函式,在人為對其賦予了新的值之後,abs便指向了新的值。
函式可以作為引數傳入至新函式或作為返回值從新函式傳出(即閉包,待更新)
>>
>
defsumabafterf
(a,b,f):.
..return f(a)
+ f(b)..
.>>
> sumabafterf(3,
4,abs)
7>>
> sumabafterf(3,
4,lambda x: x **2)
25>>
>
import math
>>
> sumabafterf(25,
36,math.sqrt)
11.0
>>
>
作用:將乙個list按照轉換函式逐項操作,並生成乙個新的list。接收2個引數,乙個轉換函式,乙個list,返回結果不更改原有list,而是重新生成乙個list。
由於list包含的元素可以是任何型別,因此,map() 不僅僅可以處理只包含數值的 list,事實上它可以處理包含任意型別的 list,只要傳入的函式f可以處理這種資料型別。
例:將列表中的每一項進行平方。
>>
> l =
list
(range(1
,11))
>>
>
map(
lambda x: x **
2, l)[1
,4,9
,16,25
,36,49
,64,81
,100
]
例:將人名規範化
>>
> l =
['adam'
,'philadephia'
,'baseball'
]>>
>
defcapitalize
(str):
...return
str[0]
.upper()+
str[1:
].lower().
..>>
>
map(capitalize, l)
['adam'
,'philadephia'
,'baseball'
]>>
>
reduce()函式也是python內建的乙個高階函式。reduce()函式接收的引數和 map()類似,乙個函式 f,乙個list,但行為和 map()不同,reduce()傳入的函式 f 必須接收兩個引數,reduce()對list的每個元素反覆呼叫函式f,並返回最終結果值。
例:求列表各項平方和
>>
>
from functools import
reduce
>>
> l =[1
,2,3
,4]>>
>
deff
(a,b):.
..return a * b..
.>>
>
reduce
(f,l)
10
reduce()還可以接收第3個可選引數,作為計算的初始值。
>>
>
from functools import
reduce
>>
> l =[1
,2,3
,4]>>
>
deff
(a,b):.
..return a * b..
.>>
>
reduce
(f,l,
100)
110
filter()函式接收乙個函式 f 和乙個list,這個函式 f 的作用是對每個元素進行判斷,返回 true或 false,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
例:從乙個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數,保留奇數
>>
> l =[1
,4,6
,7,9
,12,17
]>>
>
defodd
(x):..
.return x %2==
1...
>>
>
filter
(odd,l)[1
,7,9
,17]>>
>
filter
(lambda x: x %2==
1,l)
#lambda匿名函式與上面的odd函式等價。[1
,7,9
,17]
例:刪除空白字串
>>
> a.strip(
)'1213'
>>
> a =
'\t\n\r123\n\t\r '
>>
> a.strip(
)'123'
>>
>
#strip函式返回移除字串頭尾指定的字串行生成的新字串,預設移除空格
>>
>
def is_not_empty(s):.
..return s and
len(s.strip())
>0.
..>>
>
filter
(is_not_empty,
['test'
,none,''
,'str'
,' '
,'end'])
['test'
,'str'
,'end'
]
Python學習筆記 函式式程式設計 高階函式
根據廖雪峰python教程整理 高階函式英文叫higher order function 什麼是高階函式?我們以實際 為例子,一步一步深入概念。一 變數可以指向函式 以python 內建的求絕對值的函式 abs 為例,呼叫該函式用以下 abs 10 10 但是,如果只寫abs 呢?abs 可見,ab...
Python學習筆記之 函式式程式設計
函式式程式設計的乙個特點就是,允許把函式本身作為引數傳入另乙個函式,還允許返回乙個函式。變數可以指向函式 f abs f 10 10函式名也是變數 abs 10 abs 10 traceback most recent call last file line 1,in typeerror int o...
python學習筆記(四) 函式式程式設計
1 高階函式 高階函式 higher order function 1 變數可以指向函式 函式本身也可以賦值給變數。2 函式名也是變數 指向函式的變數。3 傳入函式 變數能夠指向函式,函式的引數能接收變數,乙個函式就可以接收另乙個函式作為引數。接收兩個引數 函式,iterable map 將傳入的函...