新聞中心
眾所周知,python功能強(qiáng)大、語(yǔ)法靈活,這些得益于其豐富而強(qiáng)大的庫(kù)。除了眾多第三方庫(kù)和方法函數(shù),python自帶的很多函數(shù)也非常有趣,用起來(lái)稱(chēng)得上優(yōu)雅。

?[[320251]]?
今天主要是分享5個(gè)python內(nèi)置的小函數(shù),都是個(gè)人覺(jué)得強(qiáng)大而精致的幾個(gè)函數(shù)。不是高深的知識(shí),純粹因?yàn)橛X(jué)得好用而分享。
01 一用而過(guò):lambda
很多語(yǔ)言都有匿名函數(shù),python的匿名函數(shù)寫(xiě)作lambda,當(dāng)需要實(shí)現(xiàn)一定功能而又不想“大張旗鼓”的def一個(gè)函數(shù)時(shí),lambda就是最優(yōu)的選擇。
其語(yǔ)法格式一般是這樣的:
lambda x:x**2
#(x)>
也可以將它賦值給一個(gè)變量,由于python中一切皆對(duì)象,所以后續(xù)程序中就可以用該變量調(diào)用這個(gè)匿名函數(shù)。
f = lambda x:x**2
f(2)
# 4
當(dāng)然,這里其實(shí)沒(méi)必要應(yīng)用lambda來(lái)實(shí)現(xiàn),因?yàn)榧热灰@式調(diào)用,還不如干脆直接寫(xiě)個(gè)明確的函數(shù)罷了。lambda函數(shù)更廣泛的應(yīng)用場(chǎng)景在于該匿名函數(shù)作為另一個(gè)函數(shù)的參數(shù)傳遞時(shí),應(yīng)用就比較合適了,例如,將lambda作為sort()函數(shù)的key參數(shù),就可以實(shí)現(xiàn)特定功能的排序。
dyct = {'a':2, 'b':1, 'c':5}
sorted(dyct.items(), key = lambda x:x[1])
# [('b', 1), ('a', 2), ('c', 5)]02 智能解壓:zip
zip函數(shù)人如其名,是打包或者解包的函數(shù),接受2個(gè)以上可迭代變量,輸出對(duì)應(yīng)位置組成元組后的迭代類(lèi)型。例如:
a = ['a', 'b', 'c']
b = (4, 5, 6)
zip(a,b)
#
list(zip(a,b))
# [('a', 4), ('b', 5), ('c', 6)]
tuple(zip(a,b))
# (('a', 4), ('b', 5), ('c', 6))
也可以接受多于2個(gè)輸入可迭代變量,而且如果各迭代變量長(zhǎng)度不一致也不會(huì)報(bào)錯(cuò),只是此時(shí)返回迭代變量取決于輸入總長(zhǎng)度最短的一個(gè)。例如:
a = ['a', 'b', 'c', 'd', 'e']
b = (4, 5, 6, 7)
c = [True, False, True]
list(zip(a,b,c))
# (('a', 4, True), ('b', 5, False), ('c', 6, True))
與zip打包相對(duì)應(yīng)的用法是解包,即對(duì)一個(gè)打包形式的元素進(jìn)行依次解包,并返回多個(gè)新的列表。例如:
aZip = (('a', 4, True), ('b', 5, False), ('c', 6, True))
a, b, c = zip(*aZip)
# a:('a', 'b', 'c')
# b:(4, 5, 6)
# c:(True, False, True)03 一一映射:map
map函數(shù)也正如其取名一樣,是一個(gè)將接受的迭代變量依次經(jīng)過(guò)某種映射,并輸出映射后的迭代變量。例如,如果對(duì)列表中的某個(gè)變量依次完成求值,并返回一個(gè)新的列表,則可以應(yīng)用map:
a = [1, 2, 3, 4]
map(str, a)
#
這是map函數(shù)的一個(gè)典型用法:接受2個(gè)參數(shù),第一個(gè)參數(shù)(上例中是str()函數(shù))是一個(gè)要作用的函數(shù),第二個(gè)參數(shù)是可迭代變量。
當(dāng)?shù)谝粋€(gè)函數(shù)的參數(shù)是是一個(gè)多變量函數(shù)時(shí),map也可以接受更多的參數(shù)。例如:
a = [1, 2, 3, 4]
b = [2, 2, 3, 3]
list(map(lambda x, y:x**y, a, b))
# [1, 4, 27, 64]
與zip函數(shù)中類(lèi)似,當(dāng)map里的函數(shù)參數(shù)長(zhǎng)度不匹配時(shí)并不會(huì)報(bào)錯(cuò),只是輸出結(jié)果將由最短的決定:
a = [1, 2, 3, 4]
b = [2, 2]
list(map(lambda x, y:x**y, a, b))
# [1, 4]
04 一夫當(dāng)關(guān):filter
與map函數(shù)類(lèi)似,filter函數(shù)也接受一個(gè)函數(shù)及其變量作為參數(shù),只是要求這個(gè)函數(shù)的返回結(jié)果是bool型,并用這個(gè)bool的結(jié)果決定輸出的取舍問(wèn)題。例如需要對(duì)一個(gè)輸入列表過(guò)濾,要求保留3的倍數(shù):
a = range(10)
filter(lambda x:x%3==0, a)
#
list(filter(lambda x:x%3==0, a))
# [0, 3, 6, 9]
這里需注意,當(dāng)filter的第一個(gè)函數(shù)返回值不是bool型時(shí)不會(huì)報(bào)錯(cuò),只是它會(huì)轉(zhuǎn)化為bool型判斷,如果判斷結(jié)果不是False(python中會(huì)判為False的變量包括0、None、[]等等),則會(huì)將其輸出,否則過(guò)濾掉:
a = range(10)
list(filter(lambda x:x%3, a))
# [1, 2, 4, 5, 7, 8]
05 萬(wàn)劍歸宗:reduce
map和filter函數(shù)都是多入多出型,實(shí)質(zhì)上是完成了特定的變換或篩選。reduce則是歸約函數(shù),將一系列輸入變量經(jīng)過(guò)特定的函數(shù)后轉(zhuǎn)化為一個(gè)結(jié)果輸出。不過(guò)可能是由于應(yīng)用場(chǎng)景有限的原因,reduce在python3中已不再是全局調(diào)用函數(shù),必須要從functools包中導(dǎo)入方可使用:
from functools import reduce
a = range(5)
reduce(lambda x, y: x+y, a)
# 10
reduce函數(shù)還可以接受一個(gè)可選的初始值作為參數(shù)。應(yīng)用reduce函數(shù)可以實(shí)現(xiàn)很多小trick,就看能不能想的到用的出:
from functools import reduce
s = 'abcdefg'
reduce(lambda x, y: y+x, s, 'AA')
# 'gfedcbaAA'
06 最后
當(dāng)然,盡管幾個(gè)函數(shù)用法不可謂不優(yōu)美、功能不可謂不強(qiáng)大,但都不是必須的,甚至某種程度上都可以用其他形式加以替代,例如map和filter函數(shù)都可以用列表推導(dǎo)式來(lái)簡(jiǎn)單實(shí)現(xiàn),reduce函數(shù)功能也頂多用一個(gè)for循環(huán)迭代就能解決。
但在致力于使python程序變得更加簡(jiǎn)潔優(yōu)雅乃至耍秀的路上,這些函數(shù)也確有其用武之地,未嘗不值得一試!
本文標(biāo)題:Python里面有幾個(gè)有趣的函數(shù)
URL鏈接:http://fisionsoft.com.cn/article/cojcecj.html


咨詢
建站咨詢
