前言各位讀者朋友好,本頭條號@傳新視界接下來將寫幾篇有關(guān)Python常用內(nèi)置函數(shù)的內(nèi)容,。我們知道Python隨身發(fā)布的類庫模塊是非常優(yōu)秀的,,如無特別需要,很多任務(wù)都可以不引入外部第三庫包就可以完成,,所以學(xué)習(xí)研究Python自身的標(biāo)準(zhǔn)庫是非常值得的,。 本篇就主要來探究一下map函數(shù)的相關(guān)情況——我這里還是結(jié)合代碼來介紹,以便你上手操作來加深理解和應(yīng)用,。開始——記得點贊 + 關(guān)注@傳新視界,,前進不迷路,! Python內(nèi)置函數(shù)map實戰(zhàn)應(yīng)用參考示例 map函數(shù)簡介使用語法為:map(function, iterable,…)。使用該函數(shù)時,,你可以直接查閱官方文檔中對內(nèi)置函數(shù)map的使用說明:
意思是說,,map函數(shù)返回的結(jié)果是個迭代器,該迭代器對每一個參數(shù)可迭代對象的項(元素)應(yīng)用相應(yīng)的函數(shù),,并產(chǎn)生相應(yīng)結(jié)果,。如果傳遞了額外的可迭代參數(shù),作為參數(shù)的函數(shù)也必須接受同樣多的參數(shù),,且并行對所有可迭代對象中的項應(yīng)用于函數(shù),。對于有多個可迭代對象的,迭代器在最短可迭代對象耗盡時停止,。 也可以可以通過help函數(shù)在IDLE模式下查看內(nèi)置說明: 查看map說明 很顯然,,map函數(shù)是來源于內(nèi)置模塊builtins中的同名map類。該類實現(xiàn)了迭代器協(xié)議,,所以它是個迭代器類,,且有個同名的函數(shù)map。經(jīng)過Python內(nèi)部的包裝,,使我們可以直接以map函數(shù)的形式直接加以使用,。 這里我們只關(guān)注官方的函數(shù)文檔描述。第一個參數(shù)須為有效函數(shù),,包括lambda函數(shù),。后面的參數(shù)可跟多個可迭代對象,也可為單個可迭代對象(單可迭代比較簡單),。 應(yīng)用實踐下面通過示例來進一步研究map函數(shù)的應(yīng)用,。 1)使用一個lambda函數(shù),它接受數(shù)量可變的位置參數(shù),,并將它們作為元組返回(下面的程序可以直接在IDLE下分別輸入運行): #map函數(shù)應(yīng)用#示例-1:傳入一個可迭代對象m1 = map(lambda *a:a,range(3))print(m1) #m為可迭代的map對象print(list(m1)) #可迭代對象轉(zhuǎn)換為list#示例-2:傳入兩個可迭代對象m2 = map(lambda *a:a,range(3),'abc')print(m2) #m2為可迭代的map對象print(list(m2)) #可迭代對象轉(zhuǎn)換為list#示例-3:傳入3個可迭代對象m3 = map(lambda *a:a,range(3),'abc',range(4,7))print(m3) #m2為可迭代的map對象print(list(m3)) #可迭代對象轉(zhuǎn)換為list#示例-4:傳入兩個可迭代對象,且有最短的空元組m4 = map(lambda *a:a,(),'abc')print(m4) #m為可迭代的map對象print(list(m4)) #可迭代對象轉(zhuǎn)換為list#示例-4:傳入兩個可迭代對象,且(1,2)最短m5 = map(lambda *a:a,(1,2),'abc')print(m5) #m為可迭代的map對象print(list(m5)) #可迭代對象轉(zhuǎn)換為list#示例-6:傳入兩個可迭代對象,且最短的是'abc'm6 = map(lambda *a:a,(1,2,3,4),'abc')print(m6) #m6為可迭代的map對象print(list(m6)) #可迭代對象轉(zhuǎn)換為list 運行上面的程序,,觀察所輸出結(jié)果類似如下:
在前面的代碼中,可以看到為什么必須將調(diào)用結(jié)果用list(…)處理,。因為如果沒有它,,我們將得到map對象的字符串表示,這在上下文中并沒啥用,,因為看不到相應(yīng)的內(nèi)容,,不知道m(xù)ap處理的是個啥結(jié)果。 你可能也注意到每個可迭代對象的元素是如何應(yīng)用于函數(shù)的:首先是每個可迭代對象的第一個元素,,然后是每個可迭代對象的第二個元素,,以此類推。還要注意到map()會在調(diào)用函數(shù)時,在最短的可迭代對象耗盡時會停止,。這實際上是一個非常好的行為特性——它既不會強迫我們將所有的可迭代對象都調(diào)整為相同的長度,,而長度都相同時,它也不會中斷執(zhí)行,。 2)自定義函數(shù)作為參數(shù)傳入map函數(shù),。我們 再來看個自定義函數(shù),使用map函數(shù)的結(jié)果來輸出符號三角形(一定注意代碼):
上述程序輸出的結(jié)果類似如下:
當(dāng)你必須對一個或多個對象集合應(yīng)用相同的函數(shù)時,,Map()非常有用。作為一個更有趣的例子,,讓我們看看裝飾-排序-非裝飾風(fēng)格(decorate-sort-undecorate,也稱為Schwartzian變換)處理示例,。在較早的Python版本中,當(dāng)排序不支持使用key function時,,這是一種非常流行的技術(shù),。如今,它已經(jīng)不那么常用了,,但這是一個很酷的技巧,,偶爾還是會派上用場。 我們來在下面的例子中看看它的變化:我們想要按學(xué)生累積的學(xué)分總和降序排序,,這樣就可以讓成績最好的學(xué)生排在第0位,。我們編寫一個函數(shù)來生成一個裝飾對象,然后進行排序,,然后進行非裝飾,。每個學(xué)生有三個(可能不同的)科目的學(xué)分。在這個上下文中,,修飾一個對象意味著轉(zhuǎn)換它,,要么向它添加額外的數(shù)據(jù),要么將其放入另一個對象中,,以一種允許我們能夠按照我們想要的方式對原始對象進行排序的方式,。注意:這種技術(shù)與Python裝飾器無關(guān),我們前面已經(jīng)對裝飾器進行了討論介紹,。 排序之后,,我們恢復(fù)裝飾對象,從它們獲得原始對象,,這種處理被稱為非裝飾(即取消裝飾處理形態(tài)),。 如果上面的描述還不太清楚,請結(jié)合代碼多看兩遍。代碼清單如下: #decorate-sort-undecorate (即Schwartzian transform).# 即Schwartzian轉(zhuǎn)換處理students = [ dict(id=0, credits=dict(math=9, physics=6, history=7)), dict(id=1, credits=dict(math=6, physics=7, latin=10)), dict(id=2, credits=dict(history=8, physics=9, chemistry=10)), dict(id=3, credits=dict(math=5, physics=5, geography=7)), ]#列表的每一項即為一個字典表示的studentdef decorate(student): # 用student字典創(chuàng)建一個二元元組 (sum of credits, student) return (sum(student['credits'].values()), student)def undecorate(decorated_student): # 拋棄裝飾處理,,獲取原始的學(xué)生信息,,但為已排序的原始學(xué)生信息 return decorated_student[1]decStudents = sorted(map(decorate, students), reverse=True)print('裝飾轉(zhuǎn)換排序(降序)信息:')for s in decStudents: print(s)print('取消裝飾轉(zhuǎn)換后原始信息(有序):')undecStudents = list(map(undecorate, decStudents))for s in undecStudents: print(s) 運行程序輸出結(jié)果類似如下:
結(jié)合代碼和輸出結(jié)果,應(yīng)該不難理解,。但關(guān)于排序部分需要注意的一點是,,當(dāng)兩個或兩個以上的學(xué)生有相同的總和時會發(fā)生什么。排序算法通過相互比較學(xué)生對象來對元組進行排序,。這沒有任何意義,,在更復(fù)雜的情況下,可能會導(dǎo)致不可預(yù)測的結(jié)果,,甚至是錯誤,。如果想確保避免這個問題,一個簡單的解決方案是創(chuàng)建一個三元組而不是二元組,,將學(xué)分的總和放在第一個位置,,學(xué)生對象在學(xué)生列表中的位置或id放在第二個位置,學(xué)生對象本身放在第三個位置,。通過這種方式(即decorate返回的結(jié)果元組中間增加一個id/位置項),,此時如果積分和相同,元組將根據(jù)位置或id進行排序,,位置總是不同的,,因此足以解決任何對元組之間的排序問題。 本文小結(jié)本文主要探討了Python內(nèi)置函數(shù)map的應(yīng)用情況,,既要理解其含義,,也要能靈活掌握應(yīng)用場景,特別要注意當(dāng)傳入多個可迭代對象時處理的模式機制,,更要深入理解函數(shù)參數(shù)所應(yīng)有的目標(biāo)對象是可迭代對象中的元素項,,以及和map函數(shù)返回值——可迭代對象的轉(zhuǎn)化處理等。 |
|
來自: 網(wǎng)摘文苑 > 《函數(shù)》