python基礎6—(高階,匿名,偏)函數 | 裝飾器
阿新 • • 發佈:2018-01-22
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 wrapsdef 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—(高階,匿名,偏)函數 | 裝飾器