Python 函數語言程式設計(待續)
阿新 • • 發佈:2018-11-04
函數語言程式設計
- 把計算視為函式而非指令
- 純函數語言程式設計:不需要變數,沒有副作用,測試簡單
- 支援高階函式,程式碼簡潔
高階函式——將函式作為引數傳入函式
map()
把函式依次作用在 list 的每個元素
上,得到一個新的list
並返回
[1, 2, 3, 4, 5, 6, 7, 8, 9]
# 如果把list的每個元素都平方,就可以用map()函式:
def f(x):
return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
# 結果:
[1, 4, 9, 10, 25, 36 , 49, 64, 81]
reduce()
filter()
挑出符合條件的元素
sorted()
能自定義比較規則的sort()?
返回函式
閉包
巢狀定義函式,內層函式引用了外層函式的區域性變數,然後返回內層函式
# 一般形式:
def g():
print 'g()...'
def f():
print 'f()...'
return g
# 閉包大法後:
def f():
print 'f()...'
def g():
print 'g()...'
return g
將g()挪到函式內部,防止其他程式碼呼叫g( )
# 坑點:確保引用的區域性變數在函式返回後不能變
# 希望一次返回3個函式,分別計算1X1,2X2,3X3:
def count():
fs = []
for i in range(1, 4):
def f():
return i * i
fs.append(f)
return fs
f1, f2, f3 = count()
# 結局是f1, f2, f3 全是9
# 正確寫法:
def count():
fs = []
for i in range(1, 4):
def f (j):
def g():
return j * j
return g
r = f(i)
fs.append(r)
return fs
匿名函式——lambda
需要一個函式,又懶得特地宣告,此時就可以用lambda
表示式
arr = range(5)
print(map(lambda x: x*x, arr)) # 每個元素都平方一下
print(filter(lambda x: x%2==0, arr)) # 挑出偶數
裝飾器(decorator)
不改動原函式程式碼,在程式碼執行期間動態擴充套件原函式功能的一種機制。
實際上,裝飾器就是一個返回函式的高階函式(接收函式 -> 包裝 -> 返回新函式)
使用方法:@+函式名
# 可以極大地簡化程式碼,避免每個函式寫重複的程式碼
@log # 列印日誌
@performance # 檢測效能
@transaction # 資料庫事務
@post('/register') # URL路由
def hello():
print("Hello, World!")
# 新增功能:在列印Hello world時打印出當前時間
import time
def printTime(f):
def wrapper(*args, **kwargs):
print
偏函式
偏函式的意義在於固定某些可變引數,相當於“減飾器”
# int() 可以把字串轉換為整數,但它還額外提供了 base引數,其預設值為10
# 如果傳入 base引數,就可以做 N 進位制轉換
# 假設要轉換大量二進位制字串,每次都傳入int(x, base=2)非常麻煩,那麼就可以定一個int2()
def int2(x, base=2):
return int(x, base)
# functools.partial就是幫助我們建立這樣一個偏函式的,不用自己特意定義int2()
int2 = functools.partial(int, base=2)