什么是好的抽象蔗蹋?
比如這樣一個函數(shù):
def accumulate(combiner, base, n, term):
total, k=base, 1
while k<=n:
total,k = combiner(total, term(k)), k+1
return total
利用這個函數(shù)能夠構(gòu)建出不同的符合這個抽象的函數(shù)。
比如 將0-x間的不同特征的數(shù)相加:
term函數(shù)可以是平方凌停,立方
def summation_using_accumulate(n, term):
return accumulate(add, 0, n, term)
相乘:
def product_using_accumulate(n, term):
return accumulate(mul, 1, n, term)
將0-x間的數(shù)過濾出來相加可以這樣子做:
def filtered_accumulate(combiner, base, pred, n,term):
def combiner_if(x,y):
if pred(y):
return combiner(x,y)
else:
return x
return accumulate(combiner_if, base, n, term)
利用一個高階函數(shù),pred是過濾的規(guī)則
比如只要偶數(shù)
odd = lambda x: x%2==1
filtered_accumulate(add, 0, odd, x, term)
再比如對一個函數(shù)多次調(diào)用
repeated(square, 2)(5) = square(square(5))
利用高階函數(shù)能夠很簡單實現(xiàn)。
def repeated(f, n):
def inner(x):
nonlocal n
if n == 0:
return x
result = x
while n > 0:
result = f(result)
n -= 1
return result
return inner
但是仔細想想,似乎能夠用上面的那個函數(shù)來寫 可以這樣做:
定義一個高階函數(shù)
def compose(f, g):
def h(x):
return f(g(x))
return h
def repeated(f, n):
return accumulate(compose, lambda x:x, n,lambda k:f)
發(fā)現(xiàn) 要進行0-n次term計算览妖,用compose來組合起來 都可以用accumuldate這個抽象
比如上面這個例子 對x進行term計算,然后組合.
lambda 表達式揽祥,注意它是運行時綁定的讽膏。
>>> a=3
>>> b=2
>>> c = lambda a,b:a+b
>>> b-=a
>>> c(a,b)
2
遞歸:
以常見的斐波那契數(shù)列來說
樹形遞歸,復(fù)雜度最高拄丰,有很多的重復(fù)計算府树。
從f(1)=1開始的。
def fib(n):
if n<2:
return n
return fib(n-1)+fib(n-2)
我們可以這樣子寫料按,利用數(shù)來保存中間變量奄侠,不用重復(fù)計算。
def fib2(a,b,n):
if n > 0:
return fib2(b,a+b,n-1)
return a
裝飾器:
@decorator
def func
相當(dāng)于decorator(func)
能夠用裝飾器做很多事情载矿。比如:
定義一個memo緩存函數(shù)垄潮,來優(yōu)化上面的fib
def memo(f):
cache = {}
def helper(*args):
if args not in cache:
cache[args]=f(args)
return cache[args]
return helper
利用了一個緩存來保存變量。
總結(jié) 要多思考建立好的函數(shù)抽象闷盔。
函數(shù)編碼原則:
- 函數(shù)名 稱應(yīng) 該小寫 弯洗, 以下劃 線分隔。 提倡描述性的名 稱逢勾。
- 函數(shù)名 稱通常反映解釋器 向參數(shù)應(yīng) 用 的操作( 例如 print 牡整、 add 、 square ) 溺拱, 或者結(jié)
果( 例 如 max 逃贝、 abs 、 sum ) 迫摔。 - 參數(shù)名 稱應(yīng) 小寫 沐扳, 以下劃 線分隔。 提倡單個詞的名 稱句占。
- 參數(shù)名 稱應(yīng) 該反映參數(shù)在函數(shù)中 的作用 迫皱, 并不僅僅是滿足的值的類型 。
- 當(dāng) 作用 非常明 確時辖众, 單個字母的參數(shù)名 稱可以接受, 但是永遠不要使用 l ( 小寫 的 L )
和 O ( 大寫 的 o ) 和敬, 或者 I ( 大寫 的 i ) 來避免和數(shù)字混淆凹炸。
函數(shù)設(shè)計原則
一個函數(shù)只完成一個功能,遵循dry原則昼弟。
寫函數(shù)幫助文檔啤它,利用doctest進行測試。
調(diào)試的一些原則:
逐步測試,隔離錯誤变骡,追蹤到最小的代碼片离赫。檢查假設(shè)。