1. 程式人生 > >Python學習筆記(十二):lambda表示式與函數語言程式設計

Python學習筆記(十二):lambda表示式與函數語言程式設計

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

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

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

  1. f = lambda x,y,z : x+y+z
  2. print f(1,2,3)
  3. g = lambda x,y=2,z=3 : x+y+z
  4. print g(1,z=4,y=5)
輸出結果為:
  1. 6
  2. 10
2,lambda表示式常用來編寫跳轉表(jump table),就是行為的列表或字典。例如:
  1. L = [(lambda x: x**2),
  2. (lambda x: x**3),
  3. (lambda x: x**4)]
  4. print L[0](2),L[1](2),L[2](2)
  5. D = {'f1':(lambda: 2+3),
  6. 'f2':(lambda: 2*3),
  7. 'f3':(lambda: 2**3)}
  8. print D['f1'](),D['f2'](),D['f3']()
輸出結果為:
  1. 4 8 16
  2. 5 6 8
3,lambda表示式可以巢狀使用,但是從可讀性的角度來說,應儘量避免使用巢狀的lambda表示式。

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

  1. def inc(x):
  2. return x+10
  3. L = [1,2,3,4]
  4. print map(inc,L)
  5. print map((lambda x: x+10),L)
輸出結果為:
  1. [11, 12, 13, 14]
  2. [11, 12, 13, 14]
5,列表解析可以實現map函式同樣的功能,而且往往比map要快。例如:
  1. print [x**2 for x in range(10)]
  2. print map((lambda x: x**2), range(10))
輸出結果為:
  1. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  2. [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,生成器函式就像一般的函式,但它們被用作實現迭代協議,因此生成器函式只能在迭代語境中出現。例如:
  1. def gensquares(N):
  2. for i in range(N):
  3. yield i**2
  4. for i in gensquares(5):
  5. print i,
輸出結果為:
0 1 4 9 16
8,所有的迭代內容(包括for迴圈、map呼叫、列表解析等等)將會自動呼叫iter函式,來看看是不是支援了迭代協議。

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

  1. for num in (x**2 for x in range(5)):
  2. print num,
輸出結果為:
0 1 4 9 16
10,列表解析比for迴圈具有更好的效能。儘管如此,在編寫Python程式碼時,效能不應該是最優先考慮的。

11,沒有return語句時,函式將返回None物件。

12,函式設計的概念:

  • 耦合性:只有在真正必要的情況下才使用全域性變數
  • 耦合性:不要改變可變型別的引數,除非呼叫者希望這樣做
  • 耦合性:避免直接改變另一個檔案模組中的變數
  • 聚合性:每一個函式都應有一個單一的、統一的目標

13,最後給個預設引數和可變引數的例子:

  1. def saver(x=[]):
  2. x.append(1)
  3. print x
  4. saver([2])
  5. saver()
  6. saver()
  7. saver()
輸出結果為:
  1. [2, 1]
  2. [1]
  3. [1, 1]
  4. [1, 1, 1]
</article>