1 函數式編程
1.1 匿名函數
關鍵字lambda
表示匿名函數,冒號前面的 x
表示參數。冒號後面只能有一個表達式,不寫return
,返回值就是該表達式的結果。可以不必定義函數名,直接創建一個函數對象。返回函數的時候,也可以返回匿名函數。下面的代碼是一個例子:
myabs = lambda x : -x if x < 0 else x
myabs(-2)
輸出如下:
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')
輸出如下:
98
函數還提供額外的base
參數,默認值爲10
。如果傳入base
參數,就可以做 N 進制
的轉換:
int('100', base = 8)
輸出如下:
64
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 B
4、Python把0、空字符串’'和None看成 False,其他數值和非空字符串都看成True。