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


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


 高階函數  可以把別的函數作爲參數傳入的函數叫高階函數
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))



I'm fish, I'm on.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章