Python學習之 函式式程式設計

2021-09-27 05:33:00 字數 2926 閱讀 5198

1 函式式程式設計

1.1 匿名函式

關鍵字lambda表示匿名函式,冒號前面的 x 表示引數。冒號後面只能有乙個表示式,不寫return,返回值就是該表示式的結果。可以不必定義函式名,直接建立乙個函式物件。返回函式的時候,也可以返回匿名函式。下面的**是乙個例子:

myabs = lambda x : -x if x < 0 else x

myabs(-2)

輸出如下:

1.2 返回函式

python的函式不但可以返回int、str、list、dict等資料型別,還可以返回函式!

比如,定義乙個函式 f(),我們讓它返回乙個函式g,可以這樣寫:

def f():

print('call f()...')

def g(): # 定義函式g

print('call g()...')

return g # 返回函式g()

上述**中在函式f()內部又定義了乙個函式g()。由於函式g() 也是乙個物件,函式名g()就是指向函式g()的變數,所以,最外層函式f()可以返回變數g(),也就是函式g()本身.呼叫函式f(),我們會得到f()返回的乙個函式:

x = f() # 呼叫f()

輸出如下:

call f()...

1.3 閉包

在函式內部定義的函式和外部定義的函式是一樣的,只是他們無法被外部訪問:

def g(): # 定義函式g

print('call g()...')

def f():

print('call f()...')

return g # 返回函式g()

將g()的定義移入函式f()內部,防止其他**呼叫g():

def f():

print('call f()...')

def g(): # 定義函式g

print('call g()...')

return g # 返回函式g()

像這種內層函式引用了外層函式的變數(引數也算變數),然後返回內層函式的情況,稱為閉包closure。閉包的特點是返回的函式還引用了外層函式的區域性變數。所以,要正確使用閉包,就要確保引用的區域性變數在函式返回後不能變。

1.4 偏函式

int()函式可以把字串轉換為整數。當僅傳入字串時,int()函式預設按十進位制轉換:

int('98')

輸出如下:

函式還提供額外的base引數,預設值為10。如果傳入base引數,就可以做 n 進製的轉換:

int('100', base = 8)

輸出如下:

functools.partial就是建立乙個偏函式的,可使用下面的**建立乙個新的函式:

import functools

int2 = functools.partial(int, base = 2)

int2('1000')

輸出如下:

8無錫看**的醫院

functools.partial可以把乙個引數多的函式變成乙個引數少的新函式,少的引數需要在建立時指定預設值,函式呼叫的難度就降低了。

1.5 reduce函式

使用reduce(),需要匯入functools包下的reduce:

from functools import reduce

reduce()函式接收的引數是乙個函式f和乙個list,f必須接收兩個引數。reduce()對list的每個元素反覆呼叫函式f,並返回最終結果值。

下面是乙個函式f:

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。

reduce()還可以接收第3個可選引數,作為計算的初始值。如果把初始值設為100,計算:reduce(f, [1, 3, 5, 7, 9], 100),結果將變為125,因為第一輪計算是:計算初始值和第乙個元素:f(100, 1),結果為101。

1.6 filter函式

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()函式過濾掉偶數:

list(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

然後輸入:

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

輸出為:

['test', 'end']

2 python學習需要注意的點

1、空值為none而不是null;

2、true或者false首字母要大寫;

3、print()會依次列印每個字串,遇到逗號,的話,會輸出乙個空格。下面的**是乙個例子:

print('a', 'b')

輸出如下:

a b4、python把0、空字串』'和none看成 false,其他數值和非空字串都看成true。

Python學習筆記之 函式式程式設計

函式式程式設計的乙個特點就是,允許把函式本身作為引數傳入另乙個函式,還允許返回乙個函式。變數可以指向函式 f abs f 10 10函式名也是變數 abs 10 abs 10 traceback most recent call last file line 1,in typeerror int o...

python學習筆記之函式式程式設計

把運算過程寫成函式巢狀呼叫的表示式 例如數學表示式 1 2 3 4 面向過程 a 1 2 b a 3 c b 4 函式式 result subtract multiply add 1,2 3 4 add 1,2 multiply 3 subtract 4 merge 1,2 3,4 sort sea...

Python之 函式式程式設計

f lambda x x 2 定義函式f x x 2 g lambda x,y x y 定義函式g x,y x y 假設有乙個列表a 1,2,3 要給列表中的每個元素都加2得到乙個新列表,利用列表解析,我們可以這樣寫 b i 2 for i in a 利用map函式我們可以這樣寫 b map lam...