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...