Python编程 高阶函数使用技巧
在堅持的初期,堅持本身比堅持的事情更重要。也許,生活的意義并不在于實現了怎樣偉大的夢想,而是在于自己全身心地投入,讓每一天都成為夢想的一部分。只要是能確定帶給自己價值感的事情,去做就好。時間在流逝,每一天,都值得認真對待。
作者:葉庭云
高階函數指的是能接收一個或多個函數作為參數的函數,python中有一些內置的高階函數,在某些場合使用可以提高代碼的效率。
一、map函數
map(function,?iterable,?...)返回一個將 function 應用于 iterable 中每一項并輸出其結果的迭代器。如果傳入了額外的 iterable 參數,function 必須接受相同個數的實參并被應用于從所有可迭代對象中并行獲取的項。
y,?m,?d?=?map(int,?input().split('/')) print(y,?m,?d) print(type(y),?type(m),?type(d))輸入:2020/9/3 結果如下: 2020?9?3 <class?'int'>?<class?'int'>?<class?'int'> import?math #?對數據做映射 print(list(map(lambda?x:?2?**?x?+?1,?[1,?3,?5,?7])))??? print(list(map(lambda?y:?math.log10(y),?[10,?100,?1000,?10000]))) print(list(map(lambda?x,?y:?x?**?2?+?y,?[1,?2,?3,?4,?5],?[1,?2,?3,?4,?5])))運行結果如下: [3,?9,?33,?129] [1.0,?2.0,?3.0,?4.0] [2,?6,?12,?20,?30] 再舉個簡單例子,假設用戶輸入的英文名字不規范,沒有按照首字母大寫,后續字母小寫的規則 利用map()函數,把一個list(包含若干不規范的英文名字)變成一個包含規范英文名字的list。輸入:['bob',?'LISA',?'barT',?'faker'] 輸出:['Bob',?'Lisa',?'Bart',?'Faker'] def?trans(s):s?=?s[0].upper()?+?s[1:].lower()??#?首字母大寫??后續字母小寫return?sprint(list(map(trans,?['bob',?'LISA',?'barT',?'faker']))) print(list(map(lambda?x:?x[0].upper()?+?x[1:].lower(),?['bob',?'LISA',?'barT',?'faker'])))運行結果如下: ['Bob',?'Lisa',?'Bart',?'Faker'] ['Bob',?'Lisa',?'Bart',?'Faker']二、filter函數
filter(function,?iterable)?#?function為判斷函數,iterable為可迭代對象filter() 函數用于過濾序列,過濾掉不符合條件的元素,返回一個迭代器對象,如果要轉換為列表,可以使用 list() 來轉換。接收的兩個參數中,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判斷,然后返回 True 或 False,最后將返回 True 的元素放到迭代器中。如果 function 是 None ,則會假設它是一個身份函數,即 iterable 中所有返回假的元素會被移除。
lis?=?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10] print(list(filter(lambda?x:?x?%?2,?lis)))??????#?符合條件??得到奇數 print(list(filter(lambda?y:?y?%?2?==?0,?lis)))?#?得到偶數運行結果如下: [1,?3,?5,?7,?9] [2,?4,?6,?8,?10] #?如果 function 是None,則會假設它是一個身份函數,即 iterable 中所有返回假的元素會被移除。 s?=?[1,?2,?'',?[],?{},?(),?'123'] print(list(filter(None,?s)))運行結果如下: [1,?2,?'123'] #?利用filter函數篩選出水仙花數 #?水仙花數是指一個3位數,它的每個位上的數字的3次冪之和等于它本身(例如:1^3 + 5^3 + 3^3 = 153) lis?=?[i?for?i?in?range(100,?1001)]??#?三位數 #?輸出水仙花數 print(list(filter(lambda?x:?x?==?sum([int(i)?**?3?for?i?in?str(x)]),?lis)))運行結果如下: [153,?370,?371,?407] 在這里插入圖片描述#?filter的應用案例-埃氏篩法求素數def?odd_sequence():????#?構造從3開始的奇數序列n?=?1while?True:n?=?n?+?2yield?ndef?prime_filter(prime_num):???#?篩選素數的函數return?lambda?x:?x?%?prime_num?>?0def?primes():yield?2??#?先返回第一個素數2,然后利用filter()函數不斷產生篩選后的新序列nums?=?odd_sequence()while?True:prime_num?=?next(nums)???#?取出序列第一個數yield?prime_num??????????#?返回序列第一個數nums?=?filter(prime_filter(prime_num),?nums)??#?得到新序列def?main():for?n?in?primes():if?n?<?100000:print(n)else:breakif?__name__?==?'__main__':main()三、sorted函數
- 根據 iterable 中的項返回一個新的已排序列表。 
- 具有兩個可選參數,它們都必須指定為關鍵字參數。key:指定帶有單個參數的函數,用于從 iterable 的每個元素中提取用于比較的鍵 (例如 key=str.lower)。默認值為 None (直接比較元素) reverse:為一個布爾值,如果設為 True,則每個列表元素將按反向順序比較進行排序 
四、reduce函數
reduce把一個函數作用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算。返回的是一個計算的最終結果。
from?functools?import?reduces?=?[0,?1,?2,?3,?4,?5,?6,?7,?8,?9] #?做累積計算 print(reduce(lambda?x,y:?x?+?y,?s)) print(reduce(lambda?x,y:?10?*?x?+?y,?s)) print(reduce(lambda?x,y:?str(x)?+?str(y),?s))運行結果如下: 45 123456789 0123456789結語
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對小編的支持。
由于微信平臺算法改版,公號內容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星標我們和給我們多點點【在看】。星標具體步驟為:
總結
以上是生活随笔為你收集整理的Python编程 高阶函数使用技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 非常实用的 Python 库,推一次火一
- 下一篇: 力荐!Python的14张思维导图 |
