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

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

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