本文中所指的高階函式,是可以接收函式作為引數傳入或者將函式作為返回值,這就是函式式程式設計,是一種高度抽象的程式設計正規化。
常見的內建高階函式包括:map,reduce,filter,sorted,用法下面以sorted舉例。
sorted(['1','33','2'],key=int) # 返回 ['1', '2', '33']
其餘內建函式用法可以參考我的文章:python學習之序列推導式與常用內建高階函式和模組。
當乙個函式a的返回為另乙個函式時,該函式程式結構稱為閉包,需要注意的是,返回的函式並未立即執行,返回函式中不要引用任何可能會變化的變數。
# 閉包舉例
def a(*args):
def b():
sm = ''
for i in args:
sm += i
return sm
return b
x = a('11','22')
print(x()) # 返回 '1122'
閉包在日常應用中最多的就是裝飾器,它是一種多層巢狀的閉包結構。
def executes(notes):
def decorator(func):
print('%s' % (notes))
return func(*args, **kw)
return decorator
# 裝飾器的使用
@executes('execute program...')
def test(arg):
print(arg)
#執行被裝飾函式test
>>> test('contents')
execute program...
contents
在傳遞函式的過程中,為了避免某些依賴函式(被修飾的函式)簽名(例如 __name__ 屬性等)的**執行時出錯,需要借助python內建的functools.wraps做處理。
import functools
def executes(notes):
def decorator(func):
@functools.wraps(func)
print(notes)
return func(*args, **kw)
return decorator
應用舉例:計時功能的裝飾器如下
def times(num):
def wp(func):
def wrap(*args):
t1=time.time()
for i in range(num):
func(*args)
print(func.__name__)
print(time.time()-t1)
return wrap
return wp
@times(1000)
def test():
a=for i in range(1000):
a+=[i]
# 函式 test 執行1000次 所用的時間(秒)
test() # 0.144999980927
以上是裝飾器函式中包含引數的情況,如果不需要引數,可以減少 封裝 層數。
def times(func):
def wrap(*args):
t1=time.time()
func(*args)
print(func.__name__)
print(time.time()-t1)
return wrap
@times
def test():
a=for i in range(1000):
a+=[i]
## 函式 test 執行1次 所用的時間(秒)
test() # 0.000999927520752
乙個函式可以同時定義多個裝飾器:
@a
@bdef f():
pass
執行順序是從裡到外,由近及遠,它等效於f = a(b(f))。
迭代器是乙個可以記住遍歷的位置的物件,迭代器物件的訪問從集合的第乙個元素開始,直到所有的元素被訪問。迭代器的兩個基本方法:iter()和next(),迭代是通過for … in來完成的。
凡是可作用於for迴圈的物件都是可迭代(iterable)型別,凡是可作用於next()函式的物件都是迭代器(iterator)型別,集合資料型別如list、dict、str等是iterable但不是iterator,但可以通過**iter()**函式轉化為迭代器物件。
可迭代物件:實現了__iter__方法或者__getitem__方法(引數為從0開始的索引)的物件
迭代器:實現了__next__(返回下乙個元素)和__iter__方法(返回迭代器本身)的物件。
from collections import iterator
# 迭代器判斷
>>> isinstance('abc', iterator)
false
>>> isinstance(iter('abc'), iterator)
true
生成器(generator)也是一類可迭代物件,generator儲存的是演算法,每次呼叫next()方法,就計算出下乙個元素的值,直到計算出最後乙個元素,丟擲stopiteration的錯誤。
如果乙個函式定義中包含yield關鍵字,那麼這個函式就是乙個生成器。變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
def test():
print('aaa')
yield 1
print('bbb')
yield 2
>>> a=test()
>>> next(a)
aaa1
>>> next(a)
bbb2
>>> next(a)
traceback (most recent call last):
file "", line 1, in stopiteration
生成器中的傳值
使用send方法實現傳值
def filter_keyword(keyword):
print('search for keyword: {}'.format(keyword))
while true:
inputs = (yield)
if keyword in inputs:
print('found keyword.')
else:
print('no found')
a = filter_keyword('test')
next(a) # 輸出 search for keyword: test
a.send('asdas') # 輸出 no found
a.send('32123test') # 輸出 found keyword
a.close() # 關閉生成器
遞迴就是函式內部會呼叫函式自身。
def fact(n):
if n == 1:
return 1
return n * fact(n - 1)
遞迴函式的優點是邏輯簡單清晰,缺點是過深的呼叫會導致棧溢位。
理論上,所有的遞迴函式都可以寫成迴圈的方式,所以可以通過迴圈進行替換。
def fact(n):
r = 1
for i in range(1, n+1):
r *= i
return r
python高階學習之高階函式
高階函式就是把函式當做引數傳遞的一種函式,例如 執行結果 map 接收乙個函式 f和乙個list,並通過把函式 f 依次作用在 list 的每個元素上,得到乙個新的 list 並返回。執行結果 reduce 函式接收的引數和 map 類似,乙個函式 f,乙個list,但行為和 map 不同,redu...
Python之高階函式
一 什麼是高階函式 函式作為實參傳遞給函式的或者函式名為返回值的函式稱為高階函式。1 實參傳遞給函式 2 函式名為返回值 二 系統內建的高階函式 1 map函式 至少需要兩個引數,第乙個引數是函式名,第二個引數是序列 str,list,tuple map功能 把序列中的每乙個元素作為引數,傳給函式進...
Python之高階函式
做過swift開發的童鞋都知道,在swift中有許多的高階函式 map,filter,reduce,zip等 這些在開發中讓我們節省大量 python中同樣有許多的內建函式,但是這裡也只介紹幾個常用的高階函式 根據提供的函式對指定序列做對映,並返回對映後的序列 map function,iterab...