Python學習筆記 函式式程式設計和高階函式

2021-09-12 20:32:17 字數 4114 閱讀 3130

百科定義:

函式式程式設計是種程式設計方式,它將電腦運算視為函式的計算。函式程式語言最重要的基礎是λ演算(lambda calculus),而且λ演算的函式可以接受函式當作輸入(引數)和輸出(返回值)。

我理解起來,這句話的意思就是,將乙個個函式視為最小的運算單元,不關心中間的過程,而重在最後的輸出,對於同樣的輸入,必定有同樣的輸出,不依賴周圍環境,不改變其它變數或者狀態。

這裡的函式指的是數學意義上的函式:

給定乙個數集a,對a施加對應法則f,記作f(a),得到另一數集b,也就是b=f(a)。

那麼這個關係式就叫函式關係式,簡稱函式。函式概念含有三個要素:定義域a、值域c和對應法則f。其中核心是對應法則f,它是函式關係的本質特徵。

與其相對應的概念是命令式程式設計(imperative programming)和宣告式程式設計(declarative programming),主要區別可以參考這裡。

變數可以指向函式

>>

>

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 將傳入的函...