以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]