Python中的函式式程式設計 一

2021-08-10 09:34:19 字數 4854 閱讀 9685

函式:function

函式式:functional,一種程式設計正規化

函式式程式設計的特點:

①把計算視為函式而非指令

②純函式式程式設計:不需要變數,沒有***,測試簡單

③支援高階函式,**簡潔

python支援的函式式程式設計特點:

①不是純函式式程式設計,因為python允許有變數

②支援高階函式:函式也可以作為變數傳入

③支援閉包:有了閉包就能返回函式

④有限度的支援匿名函式

高階函式:能接收函式作為引數的函式

因為:變數可以指向函式,而函式的引數可以接收變數,所以乙個函式可以接收另外乙個函式作為引數。

變數可以指向函式,在這裡變數f指向abs函式,呼叫f()和abs()原函式的效果是一致的

print(abs(-10))

f=abs

print(f(-10))

變數名其實就是指向函式的變數

print(f)

print(abs)

如果將abs變數指向len,那麼再用abs求絕對值,會報錯

abs=len

print(abs(-10))

typeerror: object of type 'int' has no len()
print(abs('222'))
3

定義乙個函式可以接收x,y,f三個引數,其中x,y為數值,f為函式
deffunction1(x,y,f):

print(f(x)+f(y))

function1(-10,10,abs)

20
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):

return x + y

呼叫 reduce(f, [1, 3, 5, 7, 9])時,reduce函式將做如下計算:

先計算頭兩個元素:f(1, 3),結果為4;

再把結果和第3個元素計算:f(4, 5),結果為9;

再把結果和第4個元素計算:f(9, 7),結果為16;

再把結果和第5個元素計算:f(16, 9),結果為25;

由於沒有更多的元素了,計算結束,返回結果25。

上述計算實際上是對 list 的所有元素求和。雖然python內建了求和函式sum(),但是,利用reduce()求和也很簡單。

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):

return x % 2 == 1

然後,利用filter()過濾掉偶數:

filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
結果:[1, 7, 9, 17]

利用filter(),可以完成很多有用的功能,例如,刪除 none 或者空字串:

def is_not_empty(s):

return s and len(s.strip()) > 0

filter(is_not_empty, ['test', none, '', 'str', ' ', 'end'])

結果:['test', 'str', 'end']

注意: s.strip(rm) 刪除 s 字串中開頭、結尾處的 rm 序列的字元。

當rm為空時,預設刪除空白符(包括'\n', '\r', '\t', ' '),如下:

a = '     123'

a.strip()

結果: '123'

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):

if x > y:

return -1

if x < y:

return 1

return 0

這樣,呼叫 sorted() 並傳入 reversed_cmp 就可以實現倒序排序:

>>> sorted([36, 5, 12, 9, 21], reversed_cmp)

[36, 21, 12, 9, 5]

sorted()也可以對字串進行排序,字串預設按照ascii大小來比較:

>>> sorted(['bob', 'about', 'zoo', 'credit'])

['credit', 'zoo', 'about', 'bob']

'zoo'排在'about'之前是因為'z'的ascii碼比'a'小。

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,雖然也可以歸結...