React引入antd-mobile+postcss搭建移動端
阿新 • • 發佈:2021-06-22
函數語言程式設計
高階函式:一個函式可以接收另一個函式作為引數
map() : map(function, Iterrable) :將傳入的函式一次作用於序列的每個元素上,並將結果作為新的Iterator返回
# 實現,f(x) = x2, 作用於l = [1,2,3,4] def func(x): return x*x L = reduce(func, [1,2,3,4]) print(L)
reduce() :reduce把一個函式作用在一個序列上,該函式必須接收兩個引數,reduce把結果繼續和序列的下一個元素做累積計算
# 實現[1,2,3,4,5]Z轉換為12345def func(x,y): return x×10 + y L = reduce(func, [1,2,3,4,5,6]) print(L)
filter() : filte把傳入的函式作用於每個元素,根據返回值true/false 過濾元素
# 將序列中的空字串刪除 def not_empty(s): return s and s.strip() # print(list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])))
# 使用filter篩選出回數 def is_palindrome(n):return str(n) == str(n)[::-1] output = filter(is_palindrome, range(1, 1000)) print('1~1000:', list(output))
sorted():可接收一個key函式實現自定義的排序,將函式作用於每一個元素,按key函式返回的結果進行排序
print(sorted([36, -25, -68, 79], key=abs)) print(sorted(['bob', 'about','Zoo'])) print(sorted(['bob', 'about','Zoo'], key=str.lower))>>> [-25, 36, -68, 79] ['Zoo', 'about', 'bob'] ['about', 'bob', 'Zoo']
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] def by_name(t): return t[0].lower() def by_score(t): return t[1] print(sorted(L, key=by_score, reverse=True)) print(sorted(L, key =by_name ))
返回函式:閉包,將函式作為結果值返回(返回函式名)
# 計數器,每次呼叫counterA()時,+1 def createCounter(): f = [0] def counter(): f[0] = f[0] + 1 return f[0] return counter counterA = createCounter() print(counterA(),counterA())
匿名函式:lambda x:(x為函式引數)不需要顯示定義函式,使用表示式的結果作為返回值
L = list(filter(lambda x: x %2 ==1 , range(1,20))) print(L)
裝飾器:呼叫函式時,不修改函式定義,但呼叫時動態增加功能的方式
# 裝飾器函式 def log(func): @functools.wraps(func) def wrapper(*args, **kw): print(func.__name__) return func(*args, **kw) return wrapper @log #將裝飾器裝飾在now函式上 def now(): print('2015-3-25') now() print(now.__name__)
當裝飾函式需要傳入引數時
# 當裝飾器函式需要傳入引數時: def log(text): def derectorA(func): @functools.wraps(func) def wrapper(*args, **kw): print(func.__name__) return func(*args, **kw) return wrapper return derectorA @log('execute') def now(): print('2021-6-23') now() print(now.__name__)
例:設計一個裝飾器,開啟多裝飾函式的執行時間
# 設計decoratoe,列印函式的執行時間 import time def metric(fn): @functools.wraps(fn) # 作用是讓所裝飾的函式名稱等屬性複製到wrapper上,(保證依賴函式簽名的程式碼執行正常) def wrapper(*args, **kw): t1 = time.time() print(t1) fn(*args, **kw) t2 = time.time() print(t2) print('%s executed in %s ms' % (fn.__name__, t2-t1)) return fn(*args, **kw) return wrapper # 測試 @metric def fast(x, y): time.sleep(0.0012) return x + y @metric def slow(x, y, z): time.sleep(0.1234) return x * y * z f = fast(11, 22) s = slow(11, 22, 33)
偏函式:將函式的某些引數固定,返回一個新的函式(與預設引數的作用一致,降低函式呼叫的難度)
# 實現轉換二進位制字串,int(x, base =2)[應用於批量轉換二進位制字串] int2 = functools.partial(int, base = 2) #偏函式 print(int2('100011')) print(map(int2, ['110', '100', '001']))