今天主要學習了Python函數式編程,在此總結一下
1.Python中函數也是一種對象,我們可以用變量來指向函數,並且實現調用。
f=abs l=f(-10) print(l) #Output:10
2.函數中可以傳入函數,這樣的函數叫做高階函數。
f=abs def add(a,b,f): c=a+b+abs(-1) print('sum is %d'%c) add(1,2,f) #Output:sum is 4
上述add方法中, f作為參數傳給了add。add方法是一個高階函數。
3.Python提供了許多強大的內建函數供調用。比如reduce、map、fliter、sorted。接下來簡要介紹一下這幾個函數。
在介紹上述幾個高階函數之前,我們需要先了解一些有關Iterator(迭代器)和Iterable(可迭代)的基礎知識。
給定一個list或者tuple,我們可以用for循環來遍歷至二個list或者tuple。這種遍歷稱為迭代(Iteration)。
凡是可以直接作用於for循環的對象統統稱為可迭代對象:Iterable。可用isinstance()來判斷一個對象是否是Iterable。
凡是可以被next()函數調用並不斷返回下一個值的對象稱為迭代器:Iterator。可用isinstanceoc判斷一個對象是否是Iterator對象。
Iterator是惰性的,他不會直接包含計算結果,可以使用list()把Iterator轉為一個list。
了解完Iterable和Iterator之后,我們回過來看map。
map(func,seq)
map函數是一個內置的高階函數。該方法把func 函數作用在參數seq的每一個元素上(這里的seq可以為list,可以為tuple),返回一個Iterator。
Iterator是一個惰性對象,他並不會直接包含你所想要的值,當你直接打印返回的Iterator時,你得到的並不會是你所期望的值,而是該對象的一些屬性(內存地址)。若要得到該對象的值,我們可以使用list強制Iterator把結果計算出來,最后得到的是一個list。
def f(x): return x*x m=map(f,[1,2,3,4,5,6]) print(m) #Output:<map object at 0x000002784869F128> l=list(m) print(l) #Output:[1, 4, 9, 16, 25, 36]
reduce(func,seq)
reduce把func作用在seq的元素上,並把作用后的結果繼續與seq的下一個元素做累積。
比如實現一個累積求和:
from functools import reduce def f(x,y): return x+y s=reduce(f,[1,2,3,4,5,6]) print(s) #Output:21
fliter(func,seq)
fliter把func作用在seq上,並根據返回值是True還是False來決定保留還是丟棄該元素。簡單來說,fliter實現了一個篩選的功能。
def get_odd(x): return x % 2 == 1 s=filter(get_odd,[1,2,3,4,5,6]) print(list(s)) #Output:[1, 3, 5]
sorted(seq,key,reverse)
如其名,sorted常用於排序,默認的sorted排序是根據ASCII碼按照升序的方式來排列的。我們可以向sorted中傳入一個函數實現特定需求的排序。如果我們需要得到他的反向排序時,我們可以把reverse指定為True。sorted排序並不會影響到原來的序列。
num=[4,2,6,-5,-9,3,8] #默認排序 print(sorted(num)) #傳入函數abs(絕對值) print(sorted(num,key=abs)) #反向排序 print(sorted(num,key=abs,reverse=True)) Output: [-9, -5, 2, 3, 4, 6, 8] [2, 3, 4, -5, 6, 8, -9] [-9, 8, 6, -5, 4, 3, 2]
可以看出,Python的函數式編程強大而靈活。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。