我們通常說使用函數(shù)對列表進行篩選,有多少小伙伴能夠理解篩選的原理呢?今天小編為大家?guī)砹诵屡笥裦ilter函數(shù),相較于以往能實現(xiàn)篩選功能的函數(shù)來說是復雜的,這也算是對于一些有難度函數(shù)學習的考驗。我們會著重于探討filter函數(shù)篩選后的返回值,對于返回值的迭代進行一些原理的分析。
filter用于過濾篩選可迭代對象中的元素,如果符合條件則返回對應的元素序列(類型為filter),filter接受兩個參數(shù),一個是函數(shù)用于篩選元素,返回值為True或Flase,另一個是可迭代對象。
filter用法
evens = filter(is_odd, range(-5, 10))
print(list(evens))
示例結(jié)果:
[2, 4, 6, 8]
filter函數(shù)的返回值是一個可迭代對象,這一點很關(guān)鍵,這也是為什么我說filter函數(shù)是高級語法的原因。
為什么不返回列表?,如果返回的是列表,那么在filter函數(shù)執(zhí)行過程中,就必須對列表里的每一個數(shù)據(jù)進行對2取模運算,這樣很浪費空間,因此filter在實現(xiàn)時采用了迭代器技術(shù),將計算延遲到對filter函數(shù)返回結(jié)果進行遍歷時才進行。
怎么驗證上面的說法呢,對代碼稍加修改
from collections import Iterable
def func(x):
print("接收參數(shù)" + str(x))
return x%2 == 0
lst = [1, 2, 5, 6, 7]
res = filter(func, lst)
# res 是一個可迭代對象
print(isinstance(res, Iterable), type(res))
for item in res:
print(item)
現(xiàn)在,我不使用lambda表達式對數(shù)據(jù)進行判斷,而是使用自由度更高的函數(shù),在函數(shù)func中,我輸出接收到的參數(shù),如果對lst數(shù)據(jù)中的過濾發(fā)生執(zhí)行filter函數(shù)期間,那么,在輸出res類型之前,就會執(zhí)行函數(shù)func中的print語句,現(xiàn)在來看程序?qū)嶋H的執(zhí)行結(jié)果
True
接收參數(shù)1
接收參數(shù)2
2
接收參數(shù)5
接收參數(shù)6
6
接收參數(shù)7
程序輸出結(jié)果表明,在執(zhí)行filter函數(shù)時,并沒有調(diào)用func函數(shù)對lst中的數(shù)據(jù)進行過濾,而是在對res進行遍歷時才調(diào)用func函數(shù)進行過濾。
在filter函數(shù)返回的問題上我們又進行了深入的探索,用代碼分析了為什么返回不是列表的原因。
如今python編程語言市場需求大,薪資待遇上萬盡在咫尺!如果你也想學習python技術(shù)可以填寫下面表單,Python學習資料限時免費領!
下一篇: 沒有了
初級會計職稱中級會計職稱經(jīng)濟師注冊會計師證券從業(yè)銀行從業(yè)會計實操統(tǒng)計師審計師高級會計師基金從業(yè)資格稅務師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價格鑒證師統(tǒng)計資格從業(yè)
一級建造師二級建造師消防工程師造價工程師土建職稱房地產(chǎn)經(jīng)紀人公路檢測工程師建筑八大員注冊建筑師二級造價師監(jiān)理工程師咨詢工程師房地產(chǎn)估價師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設備監(jiān)理師環(huán)境影響評價土地登記代理公路造價師公路監(jiān)理師化工工程師暖通工程師給排水工程師計量工程師
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護士資格證初級護師主管護師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗技師臨床醫(yī)學理論中醫(yī)理論