1. 程式人生 > >Python 函數語言程式設計(待續)

Python 函數語言程式設計(待續)

函數語言程式設計

  • 把計算視為函式而非指令
  • 純函數語言程式設計:不需要變數,沒有副作用,測試簡單
  • 支援高階函式,程式碼簡潔

高階函式——將函式作為引數傳入函式

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)