Python編程 高階函數(shù)使用技巧
在堅持的初期,堅持本身比堅持的事情更重要。也許,生活的意義并不在于實現(xiàn)了怎樣偉大的夢想,而是在于自己全身心地投入,讓每一天都成為夢想的一部分。只要是能確定帶給自己價值感的事情,去做就好。時間在流逝,每一天,都值得認真對待。
作者:葉庭云
高階函數(shù)指的是能接收一個或多個函數(shù)作為參數(shù)的函數(shù),python中有一些內置的高階函數(shù),在某些場合使用可以提高代碼的效率。
一、map函數(shù)
map(function,?iterable,?...)
返回一個將 function 應用于 iterable 中每一項并輸出其結果的迭代器。如果傳入了額外的 iterable 參數(shù),function 必須接受相同個數(shù)的實參并被應用于從所有可迭代對象中并行獲取的項。
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
#?對數(shù)據(jù)做映射
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]
再舉個簡單例子,假設用戶輸入的英文名字不規(guī)范,沒有按照首字母大寫,后續(xù)字母小寫的規(guī)則
利用map()函數(shù),把一個list(包含若干不規(guī)范的英文名字)變成一個包含規(guī)范英文名字的list。
輸入:['bob',?'LISA',?'barT',?'faker']
輸出:['Bob',?'Lisa',?'Bart',?'Faker']
def?trans(s):
????s?=?s[0].upper()?+?s[1:].lower()??#?首字母大寫??后續(xù)字母小寫
????return?s
print(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函數(shù)
filter(function,?iterable)?#?function為判斷函數(shù),iterable為可迭代對象
filter() 函數(shù)用于過濾序列,過濾掉不符合條件的元素,返回一個迭代器對象,如果要轉換為列表,可以使用 list() 來轉換。接收的兩個參數(shù)中,第一個為函數(shù),第二個為序列,序列的每個元素作為參數(shù)傳遞給函數(shù)進行判斷,然后返回 True 或 False,最后將返回 True 的元素放到迭代器中。如果 function 是 None ,則會假設它是一個身份函數(shù),即 iterable 中所有返回假的元素會被移除。
lis?=?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10]
print(list(filter(lambda?x:?x?%?2,?lis)))??????#?符合條件??得到奇數(shù)
print(list(filter(lambda?y:?y?%?2?==?0,?lis)))?#?得到偶數(shù)
運行結果如下:
[1,?3,?5,?7,?9]
[2,?4,?6,?8,?10]
#?如果 function 是None,則會假設它是一個身份函數(shù),即 iterable 中所有返回假的元素會被移除。
s?=?[1,?2,?'',?[],?{},?(),?'123']
print(list(filter(None,?s)))
運行結果如下:
[1,?2,?'123']
#?利用filter函數(shù)篩選出水仙花數(shù)
#?水仙花數(shù)是指一個3位數(shù),它的每個位上的數(shù)字的3次冪之和等于它本身(例如:1^3 + 5^3 + 3^3 = 153)
lis?=?[i?for?i?in?range(100,?1001)]??#?三位數(shù)
#?輸出水仙花數(shù)
print(list(filter(lambda?x:?x?==?sum([int(i)?**?3?for?i?in?str(x)]),?lis)))
運行結果如下:
[153,?370,?371,?407]

#?filter的應用案例-埃氏篩法求素數(shù)
def?odd_sequence():????#?構造從3開始的奇數(shù)序列
????n?=?1
????while?True:
????????n?=?n?+?2
????????yield?n
def?prime_filter(prime_num):???#?篩選素數(shù)的函數(shù)
????return?lambda?x:?x?%?prime_num?>?0
def?primes():
????yield?2??#?先返回第一個素數(shù)2,然后利用filter()函數(shù)不斷產(chǎn)生篩選后的新序列
????nums?=?odd_sequence()
????while?True:
????????prime_num?=?next(nums)???#?取出序列第一個數(shù)
????????yield?prime_num??????????#?返回序列第一個數(shù)
????????nums?=?filter(prime_filter(prime_num),?nums)??#?得到新序列
def?main():
????for?n?in?primes():
????????if?n?100000:
????????????print(n)
????????else:
????????????break
if?__name__?==?'__main__':
????main()
三、sorted函數(shù)
根據(jù) iterable 中的項返回一個新的已排序列表。 具有兩個可選參數(shù),它們都必須指定為關鍵字參數(shù)。key:指定帶有單個參數(shù)的函數(shù),用于從 iterable 的每個元素中提取用于比較的鍵 (例如 key=str.lower)。默認值為 None (直接比較元素) reverse:為一個布爾值,如果設為 True,則每個列表元素將按反向順序比較進行排序
#?學號?姓名?成績
d?=?{'001':?['張三',?88],?'002':?['李四',?90],?'003':?['王五',?73]}
#?按成績排序??降序??由高到低
d1?=?list(sorted(d.items(),?key=lambda?x:?x[1][1],?reverse=True))??????
print('學號?姓名?成績')
for?item?in?d1:
????print(item[0],?item[1][0],?item[1][1])
運行結果如下:
學號?姓名?成績
002?李四?90
001?張三?88
003?王五?73
#?輸入一組數(shù)到列表nums,請找到列表中任意兩個元素相加能夠等于9的元素,形成一個元組
#?使其小數(shù)在前大數(shù)在后,如:(2,7),(1,8)。重復的元組元素只保留一個,結果按元組第一個元素從大到小順序輸出
def?get_tuple(num_list):
????temp_list?=?[]
????for?i?in?num_list:
????????if?(9?-?i)?in?num_list:
????????????min_?=?(9?-?i)?if?(i?>=?(9?-?i))?else?i
????????????max_?=?i?if?min_?==?(9?-?i)?else?(9?-?i)
????????????if?(min_,?max_)?not?in?temp_list:
????????????????temp_list.append((min_,?max_))
????return?temp_list
nums?=?input("numbers:")
#?列表推導式
num_list?=?[int(i)?for?i?in?nums.split(',')]
result_list?=?get_tuple(num_list)
#?按列表里每個元組的第一個元素從大到小排序??降序
result_list?=?sorted(result_list,?key=lambda?x:?x[0],?reverse=True)
print(result_list)
運行結果如下:
numbers:3,4,5,7,2,8,1,6,9,0
[(4,?5),?(3,?6),?(2,?7),?(1,?8),?(0,?9)]
四、reduce函數(shù)
reduce把一個函數(shù)作用在一個序列[x1, x2, x3, ...]上,這個函數(shù)必須接收兩個參數(shù),reduce把結果繼續(xù)和序列的下一個元素做累積計算。返回的是一個計算的最終結果。
from?functools?import?reduce
s?=?[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
結語
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對小編的支持。

由于微信平臺算法改版,公號內容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星標我們和給我們多點點【在看】。星標具體步驟為:
(1)點擊頁面最上方“小詹學Python”,進入公眾號主頁。
(2)點擊右上角的小點點,在彈出頁面點擊“設為星標”,就可以啦。
感謝支持,比心。
