filter被稱為高階函數(shù)是有道理的。
filter(self, /, *args, **kwargs)
Docstring: filter(function or None, iterable) --> filter object
Return an iterator yielding those items of iterable for which function(item) is true. If function is None, return the items that are true.
?從Doc的簡單描述可以看出,filter的主要作用是通過function對iterable中的元素進行過濾,并返回一個迭代器(iterator),其中是function返回True的元素。如果function傳入None,則返回所有本身可以判斷為True的元素。
例1:
l = [x for x in range(10)]
print(list(filter(lambda x : x%2 == 0, l)))
#輸出[2,4,6,8]
因為filter返回的是一個iterator,所以輸出的時候需要用list進行轉(zhuǎn)換。
例2:
l = [x for x in range(0, 10)]
print(list(filter(None, l)))
#輸出[1,2,3,4,5,6,7,8,9]
和例1的輸入略有區(qū)別,輸入是0~9,filter的第一個參數(shù)傳入了None,所以在迭代過程中,0被判斷為False從而被過濾,1~9被保留下來。這個方法可以替代for循環(huán)的數(shù)據(jù)拾取。
通過上面的例子可以看出,調(diào)用filter時并沒有觸發(fā)過濾過程,因為調(diào)用filter函數(shù)只是返回了一個iterator,它是惰性計算,只有next或者list的時候,才真正開始計算過程。
上面是兩個基本的用法,接下來看filter的更高級一點兒的用法。
???
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def _not_divisible(n):
return lambda x : x%n>0
def primes():
yield 2
it = _odd_iter()
ftr = filter(_not_divisible(2), it) #1
while True:
n = next(ftr ) #2
yield n
ftr = filter(_not_divisible(n), ftr ) #3
for n in primes():
if n < 100:
print('now:',n)
else:
break
通過這個例子,可以看到filter的兩個高級用法:
1.其實filter返回的是一個filter對象。#3行通過重復(fù)賦值,可以向filter中添加多個過濾器。例子中,就是通過每次執(zhí)行#3行,把當(dāng)前素數(shù)作為新的被除數(shù)條件加入到過濾器ftr 中,所以在for循環(huán)的后續(xù)迭代中,每次都增加一個素數(shù)條件進入過濾器。
通過這種重復(fù)賦值的方法,可以給filter添加多個過濾函數(shù),極大的加強了過濾功能。
2. filter的第二個參數(shù)可以傳入iterator。當(dāng)然,此時就不能用list取filter的結(jié)果,只能用next(filter對象)取下一個過濾結(jié)果為True的元素
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
