Python基礎(chǔ):從迭代器操作看整體和局部(一)
迭代器,簡單來說就是可以一個(gè)可以裝很多東西的容器,并且這些東西可以逐個(gè)拿出來。在python中典型的就是list列表。
如平常使用的眾多工具一樣,python中也針對數(shù)組(迭代器)聚合運(yùn)算給出了標(biāo)準(zhǔn)的函數(shù)(或稱API),常見的有求和、求個(gè)數(shù)、求最大值,求最小值,均值等。
簡單計(jì)算
例如有一個(gè)由1,2,3,4構(gòu)成的數(shù)組,針對其做以上操作如下所示。
列表如下:
求和:
求個(gè)數(shù):
也就是求得該列表的長度。
求均值:
內(nèi)置函數(shù)中沒有直接給出,但是有了上面兩個(gè)可以求出的條件,此問題也不是問題。
求最大值:
求最小值:
這些簡單的計(jì)算,基本沒有難度,如果要總結(jié)下就是:函數(shù)中直接傳入迭代器,返回想要的結(jié)果。
但其實(shí)python中封裝的迭代器操作函數(shù),有比這高級(jí)的用法。
復(fù)雜計(jì)算
所說高級(jí)用法,也就是說,在這些元素不是1,2,3,4這些簡單的數(shù)字元素時(shí),而是dict字典、子列表這些更具完整信息的元素時(shí),怎么根據(jù)這些完整元素的部分特征,取出某個(gè)元素來。比如有以下一個(gè)字典元素構(gòu)成的數(shù)組:
如果想要根據(jù)這些字典局部特征count進(jìn)行對比,取得該局部最大值對應(yīng)的整體元素(字典)。
python在max函數(shù)中的另外一個(gè)參數(shù)key就可以起作用了,本質(zhì)上傳入的是一個(gè)函數(shù),簡單來講,就像一個(gè)回調(diào)函數(shù)一樣,被傳到max函數(shù)中,告訴max這個(gè)函數(shù),需要用哪個(gè)指標(biāo)來進(jìn)行比較。
當(dāng)然這個(gè)指標(biāo)可以直接被指定為比如上面的count,當(dāng)然也可以再被加工算一下得到的結(jié)果,比如讓這個(gè)count加1或者其他的計(jì)算,每個(gè)元素的count都按照這個(gè)規(guī)則計(jì)算一下之后比較,該指標(biāo)最大,那么就將這個(gè)對應(yīng)的元素返回。注意:不是返回這個(gè)元素的局部特征值(比如count)而是完整的元素。也就是這里的字典dict,比如{"name": "Tom", "count": 5, "sub": {"count": 2}},。
示例:
因?yàn)樗性刂衏ount最大的是第一條,所以比較之后,返回第一個(gè)字典。
既然可以取某個(gè)局部特征值,上面的每一個(gè)字典,還有一個(gè)嵌套字典sub,這個(gè)里面也有一個(gè)count,那它當(dāng)然也應(yīng)該可以用來作比較。
比較列表中的每個(gè)字典,取出字典中的sub key值,count值依次為2,1,4,5,3.

很顯然第4個(gè)元素的該值是最大的。即
上面的例子中地迭代器的元素是字典,當(dāng)然還可以是其他的類型,比如子數(shù)組,更一般的就是一個(gè)python對象,包括自定義的一些類型。
元素為子列表
以下是一個(gè)元素為列表的列表(迭代器)。
還是以求max為例,比如要求針對每個(gè)子列表的第二個(gè)元素為標(biāo)準(zhǔn),找出該特征值最大值對應(yīng)的元素。
直觀比較可知道答案。
lambda x: x[1]是一個(gè)匿名函數(shù),這里函數(shù)參數(shù)是x, 輸出是冒號(hào)后面的表達(dá)式x[1], 比如輸入的x為[1,4,?2], 那么函數(shù)返回的結(jié)果為x[1] = 4。
前面講到,這個(gè)匿名函數(shù)整體作為一個(gè)回調(diào)函數(shù)傳入max中,這個(gè)處理機(jī)制可以理解為以下的過程。
1、遍歷arr1中的每個(gè)元素;
2、將當(dāng)前元素作為入?yún)魅肽涿瘮?shù);
3、匿名函數(shù)輸出結(jié)果,放入一個(gè)新的迭代器,順序還是元素保持一致;
4、找出新迭代器最大值,為5,并記錄其索引為3.
5、帶著找出的索引3取到原迭代器中的元素為[3,5,1].
元素為自定義類型
以下是一個(gè)自定義的類:
通過實(shí)例化該類,組成一個(gè)新的列表arr:
類比以上操作,找出屬性count最大對應(yīng)的實(shí)例是哪個(gè)。
總結(jié):
1、需求場景:在一個(gè)迭代器中,需要根據(jù)元素的局部特征,比如字典的某個(gè)key或者對象的某個(gè)屬性,根據(jù)某個(gè)規(guī)則,選擇對應(yīng)的元素;
2、前提條件:迭代器中的所有元素,需要結(jié)構(gòu)一致,不能缺失作為規(guī)則判斷依據(jù)的局部特征;
3、想法:這里給人的感覺是,一個(gè)局部的特征決定了整個(gè)的狀態(tài),比如學(xué)生時(shí)代考試,按某個(gè)科目排序,可以選出一個(gè)第一名,比如數(shù)學(xué),選出的是這個(gè)人,而不是這個(gè)分?jǐn)?shù)本身;按不同的維度又會(huì)選擇不同的個(gè)體出來;在某個(gè)領(lǐng)域,某個(gè)個(gè)人特質(zhì)就決定了某個(gè)人的高度。