Python學習筆記(十二):lambda表達式與函數式編程

以Mark Lutz著的《Python學習手冊》爲教程,每天花1個小時左右時間學習,爭取兩週完成。 --- 寫在前面的話


2013-7-22 21:00 學習筆記

1,lambda的一般形式是關鍵字lambda後面跟一個或多個參數,緊跟一個冒號,以後是一個表達式。lambda是一個表達式而不是一個語句。它能夠出現在Python語法不允許def出現的地方。作爲表達式,lambda返回一個值(即一個新的函數)。lambda用來編寫簡單的函數,而def用來處理更強大的任務。

f = lambda x,y,z : x+y+z
print f(1,2,3)

g = lambda x,y=2,z=3 : x+y+z
print g(1,z=4,y=5)
輸出結果爲:

6
10

2,lambda表達式常用來編寫跳轉表(jump table),就是行爲的列表或字典。例如:

L = [(lambda x: x**2),
	(lambda x: x**3),
	(lambda x: x**4)]
print L[0](2),L[1](2),L[2](2)

D = {'f1':(lambda: 2+3),
	'f2':(lambda: 2*3),
	'f3':(lambda: 2**3)}
print D['f1'](),D['f2'](),D['f3']()
輸出結果爲:

4 8 16
5 6 8

3,lambda表達式可以嵌套使用,但是從可讀性的角度來說,應儘量避免使用嵌套的lambda表達式。

4,map函數可以在序列中映射函數進行操作。例如:

def inc(x):
	return x+10
	
L = [1,2,3,4]
print map(inc,L)

print map((lambda x: x+10),L)
輸出結果爲:
[11, 12, 13, 14]
[11, 12, 13, 14]

5,列表解析可以實現map函數同樣的功能,而且往往比map要快。例如:

print [x**2 for x in range(10)]
print map((lambda x: x**2), range(10))
輸出結果爲:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

6,列表解析比map更強大。例如:

print [x+y for x in range(5) if x%2 == 0 for y in range(10) if y%2 ==1]
輸出結果爲:

[1, 3, 5, 7, 9, 3, 5, 7, 9, 11, 5, 7, 9, 11, 13]

7,生成器函數就像一般的函數,但它們被用作實現迭代協議,因此生成器函數只能在迭代語境中出現。例如:

def gensquares(N):
	for i in range(N):
		yield i**2
		

for i in gensquares(5):
	print i,
輸出結果爲:

0 1 4 9 16

8,所有的迭代內容(包括for循環、map調用、列表解析等等)將會自動調用iter函數,來看看是不是支持了迭代協議。

9,生成器表達式就像列表解析一樣,但它們是擴在圓括號()中而不是方括號[]中。例如:

for num in (x**2 for x in range(5)):
	print num,
輸出結果爲:

0 1 4 9 16

10,列表解析比for循環具有更好的性能。儘管如此,在編寫Python代碼時,性能不應該是最優先考慮的。

11,沒有return語句時,函數將返回None對象。

12,函數設計的概念:

  • 耦合性:只有在真正必要的情況下才使用全局變量
  • 耦合性:不要改變可變類型的參數,除非調用者希望這樣做
  • 耦合性:避免直接改變另一個文件模塊中的變量
  • 聚合性:每一個函數都應有一個單一的、統一的目標

13,最後給個默認參數和可變參數的例子:

def saver(x=[]):
	x.append(1)
	print x
	
saver([2])
saver()
saver()
saver()
輸出結果爲:

[2, 1]
[1]
[1, 1]
[1, 1, 1]




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章