1. 程式人生 > >python基礎6—(高階,匿名,偏)函數 | 裝飾器

python基礎6—(高階,匿名,偏)函數 | 裝飾器

gpo cond result css *args start div tools lte

這裏比較的高級了, 學到這裏感覺有點意思,但是也看到了和其他語言相通點

 高階函數  可以把別的函數作為參數傳入的函數叫高階函數
def add(x, y, f):
    return f(x) + f(y)
add(-5, 6, abs)         # 11

# 匿名函數  python使用lambda來創建匿名函數  
sum = lambda arg1, arg2 : arg1 + arg2
sum(10, 20) # 30 

# reduce 內建函數是個二元操作函數, 用來將一個數據集合所有數據進行二元操作
# 先對集合第1,2 個數據進行func()操作,得到的結果與第三個數據用func()運行,如此最後得到一個結果
# 顧名思義就是reduce將一個list縮成一個值 from functools import reduce l = [1,2,3,4,5] print(reduce(lambda x, y: x-y , 1)) # x 開始的時候賦值為10, 然後依次 print(reduce(lambda x, y: x-y, l, 10)) # map 應用於每一個可叠代的項返回一個結果list,map函數會把每一個參數都以相應的處理函數進行叠代處理 # 本質就是將原有的list根據lambda法則變成另一個list l = [1, 2, 3] new_list = list(map(lambda i: i+1, l))
# 變成了 [2, 3, 4] l2 = [4, 5, 6] new_list = list(map(lambda x, y : x + y, l, l2)) # 變成了 [5, 7, 9] # filter 對序列進行過濾處理 l = [100, 20, 24, 50, 110] new = list(filter(lambda x : x < 50 , l)) # [20, 24] # 裝飾器 和測試方法中的@before @test @end 類似 可以帶參 和 多個裝飾器 # 簡單來說,你處理一個方法時需要統一做某件事 from functools import wraps
def makeHtmlTag(tag, *args, **kwds): def real_decorator(fn): # fn is hello() css_class = " class=‘{0}‘".format(kwds["css_class"]) if "css_class" in kwds else "" def wrapped(*args, **kwds): return "<" + tag + css_class + ">" + fn(*args, **kwds) + "</"+tag+">" return wrapped return real_decorator @makeHtmlTag(tag="b", css_class="bold_css") @makeHtmlTag(tag="i", css_class="italic_css") def hello(): return "hello world" print(hello()) # <b class=‘bold_css‘><i class=‘italic_css‘>Hello World</i></h> # 這裏包了倆層 b為最外面的那層,i為中間層 # 高效率的遞歸 這裏有個問題就是輸入60會超過整數範圍從而報錯 from functools import wraps from datetime import datetime def memo(fn): cache= {} miss= object() @wraps(fn) def wrapper(*args): result = cache.get(args, miss) if result is miss: result = fn(*args) cache[args] = result return result return wrapper @memo def fib(n): if n<2: return n return fib(n-1) + fib(n-2) start = datetime.now() print(fib(40)) # 102334155 end = datetime.now() print((end - start).microseconds) # 71061 def fib2(n): if n<2: return n return fib2(n-1) + fib2(n-2) start1 = datetime.now() print(fib2(40)) # 102334155 end1 = datetime.now() print((end1 - start1).microseconds) # 641741 # 偏函數 只設置一部分參數 int(123455) # 默認轉化為10進制 int(123456, base 8) # 8進制 int(123456, base 16) # 16進制 # 為了方便不需要每次都輸入多少進制的值 def int2(x, base=2): return int(x, base) # 借助functools.partial來創建一個偏函數 import functools int2 = functools.partial(int, base=2) print(int2(1000000)) # 傳字典可以默認參數 kw = {base: 2} print(int(10010, **kw)) # 傳list args = (10, 5, 6, 7) print(max(*args))

python基礎6—(高階,匿名,偏)函數 | 裝飾器