Python,你為什麼要學map,不是因為你不知道家的方向,看了就懂

2022-01-30 簡說Python

Python,你為什麼要學zip,不是因為你的存儲空間不夠,看了就懂

Python,你為什麼要學enumerate,不是在談美劇,看了就懂

先重溫一下迭代(Iteration)、迭代器對象(iterable)、迭代器(iterator )的概念:

Iteration是計算機科學的通用術語,它是指對一組元素執行一項操作,一次執行一個元素。一個很好的例子是循環 - 它適用於每個單獨的項目,直到整個項目集運行完畢為止。

Iterable是可以遍歷的對象(譯者註:在Python中所有東西都是object, 比如說變量,容器,類),iterable是可以產生iterator的object。

iterator是表示數據流的對象,它一次返回一個元素的數據。它還會記住其在迭代過程中的位置。本質上,它控制應如何迭代可迭代對象。

map()的用法

map()函數以迭代的方式將提供的功能應用於每個項目,結果是作為迭代器的map對象。語法:

map(func, *iterables)

如果沒有map(),我們將不得不編寫複雜的代碼以在多個項目上「循環」給定的函數。以一個整潔的小實驗為例:我們有一個10個單詞的列表。

test_list = ["effort", "circle", "yearly", "woolen", "accept", "lurker",
"island", "faucet", "glossy", "evader"]

我們懷疑其中一些可能是abcderian(按字母順序出現的)。我們編寫一個函數is_abecedarian來檢查給定的單詞是否為abcderian:

def is_abecedarian(input_word):
index = 0
for letter in input_word[0:-1]:
if ord(input_word[index]) > ord(input_word[index + 1]):
return False
else:
index += 1
return True

現在,我們想將函數應用於單詞列表,並創建一個將包含True和False值的新列表,以表明某些單詞是否確實是abcderian。

下面方法涉及初始化一個新列表,然後使用for循環遍歷列表元素:

value_list = []
for item in test_list:
value = is_abecedarian(item)
value_list.append(value)

輸出:

[True, False, False, False, True, False, False, False, True, False]

如果用map(),我們可以將上面的代碼簡化為一個簡潔的小代碼:

map(is_abecedarian, test_list)

請注意map()不會返回列表,而是返回一個map對象。

譯者註:map()函數在python2中返回的是列表。

你可能很好奇哪個詞實際上是abcderian的字母-讓我們編寫這個問題的答案:

for item in test_list:
if is_abecedarian(item):
print(f"The word '{item}' is abecedarian. :)")
else:
print(f"The word '{item}' is not abecedarian. (")

輸出:

The word 'effort' is abecedarian. :)
The word 'circle' is not abecedarian.
The word 'yearly' is not abecedarian.
The word 'woolen' is not abecedarian.
The word 'accept' is abecedarian. :)
The word 'lurker' is not abecedarian.
The word 'island' is not abecedarian.
The word 'faucet' is not abecedarian.
The word 'glossy' is abecedarian. :)
The word 'evader' is not abecedarian.

我們還可以用可視化的方式形象地解釋,以幫助您更好地理解它:

這張圖也有助於定義 map 和mapping-我們可以使用Allen B. Downey在他的《Think Python》書中提供的定義:

映射操作(map):一種遍歷一個序列並對每個元素執行操作的處理模式。

映射(mapping):一個集合中的每個元素對應另一個集合中的一個元素的關係

將map()轉換為列表,元組和集合

由於map()不返回列表/元組/集合,因此我們需要採取額外的步驟來轉換生成的map對象:

def capitalize_word(input_word):
return input_word.capitalize()


map_object = map(capitalize_word, ['strength', 'agility', 'intelligence'])
test_list = list(map_object)
print(test_list)

map_object = map(capitalize_word, ['health', 'mana', 'gold'])
test_set = set(map_object)
print(test_set)

map_object = map(capitalize_word, ['armor', 'weapon', 'spell'])
test_tuple = tuple(map_object)
print(test_tuple)

輸出:

['Strength', 'Agility', 'Intelligence']
{'Mana', 'Health', 'Gold'}
('Armor', 'Weapon', 'Spell')

將map()與Lambda表達式結合

Lambda表達式是對我們的工具庫的一個很好的補充:將Lambda表達式與map()代碼相結合可使您的Python程序更小,更精確。

Lambda表達式可以創建匿名函數,即未約定特定標識符的函數。相反,通過def關鍵字創建函數會將函數綁定到其唯一標識符(例如def my_function創建標識符my_function)。

但是,lambda表達式也有一系列限制:它們每個只能做一件事情,只能在一個地方使用,通常與其他功能結合使用。我們看看lambda表達式如何map()同時使用:

cities = ["caracas", "bern", "oslo", "ottawa", "bangkok"]


def capitalize_word(input_word):
return input_word.capitalize()


capitalized_cities = map(capitalize_word, cities)

更簡潔的版本:

cities = ["caracas", "bern", "oslo", "ottawa", "bangkok"]

capitalized_cities = map(lambda s: s.capitalize(), cities)

需要注意:map()和lambda表達式提供了凝聚多行代碼成一行的能力。儘管此功能非常出色,但我們需要牢記編程的黃金法則之一:代碼讀取比寫入更頻繁。這意味著map()和lambda表達式都可以提高代碼的簡潔性,但是卻犧牲了代碼的清晰度。遺憾的是,對於代碼的可讀性,實際上並沒有明確的指導方針- 隨著編程經驗的增長,大家將逐漸明白這一點。

使用map()遍歷字典

map()也非常適合遍歷字典

假設有一個包含蘋果,梨和櫻桃價格的字典,我們需要通過應用15%的折扣來更新價格表。方法如下:

price_list = {
"pear": 0.60,
"cherries": 0.90,
"apple": 0.35,
}


def calulates_discount(item_price):
return (item_price[0], round(item_price[1] * 0.85, 2))


new_price_list = dict(map(calulates_discount, price_list.items()))

輸出:

{'pear': 0.51, 'cherries': 0.77, 'apple': 0.3}

將map()與Lambda表達式組合遍歷字典

當開始組合多個功能時,編程特別有趣,一個很好的例子是map()配合使用和lambda表達式來遍歷字典。在下面的代碼中,我們初始化字典列表,並將每個字典作為參數傳遞給lambda函數。

list_of_ds = [{'user': 'Jane', 'posts': 18}, {'user': 'Amina', 'posts': 64}]

map(lambda x: x['user'], list_of_ds) # Output: ['Jane', 'Amina']

map(lambda x: x['posts'] * 10, list_of_ds) # Output: [180, 640]

map(lambda x: x['user'] == "Jane", list_of_ds) # Output: [True, False]

map()替代方法:列表解析

像所有技術/產品/方法等等一樣,一些Python開發人員認為map()函數在某種程度上不是Python風格(即未遵循應如何構建Python程序的精神和設計理念)。他們建議改用列表解析,比如:

map(f, iterable)

變成

[f(x) for x in iterable]

在速度和性能方面,map()與列表理析大致相等,因此不可能看到執行時間顯著減少 - 經驗豐富的Python開發者Wesley Chun在其演講<Python 103:Memory Model&Best Practices>中解決了這個問題,有興趣的同學可移步:https://conferences.oreilly.com/oscon/oscon2013/public/schedule/detail/29374

By:Denis Kryukov 翻譯:愛學習的胡同學

https://blog.soshace.com/python-map-function-explained-visualized/

覺得本文不錯的話,轉發、留言、點讚,是對我最大的支持。

相關焦點

  • python高階函數:map、filter、reduce的替代品
    高階函數是一種將函數作為參數,或者把函數作為結果返回的函數,map函數、sorted函數就是高階函數的典型例子。map函數在小編以前的文章中做過相應的知識分享。sorted函數是python的內置函數,它的可選參數key用於提供一個函數,它可以將函數應用到各個元素上進行排序。
  • 為什麼老有人說Python程式設計師要學Linux?
    所以Python程序看上去總是簡單易懂,初學者學Python,不但入門容易,而且將來深入下去,可以編寫那些非常非常複雜的程序。而且學完python後,可從事的職業非常廣。目前來說這個Python主要方向有五個:自動化運維、自動化測試、人工智慧、數據分析、全棧開發。
  • 學python?不是一個python入門教程就行,學之前你必須知道這些
    第一 學習方向:python應用方向很多,必須明確學習方向想全棧開發:就是web應用開發,是用來寫網站後臺的數據分析:三秋道果_python自學教程指南第二 學習目標:是自我提升還是轉行就業,目的不一樣選擇的是有「巨大」區別的
  • 為什麼大家都推薦你學python?看完這5個例子就明白了!
    為什麼大家都推薦你學Python?而不是C語言或者是JAVA呢?因為——python很靈活,一定程度上函數也可以傳參和注入,所以代碼的靈活性要大的多。python自帶了函數的curry化以及遲滯運算方式,以及閉包語法更容易實現,所以在一定層面上python還是比java難掌控的。python擁有的duck typing屬性,作為動態語言專有的特性,python可以讓對象擺脫靜態語言範式的約束,隨意的給程序打補丁,所以程序擴展性更好。
  • 為什麼我要推薦你學Python
    如果你是計算機相關專業,建議你去學Python!   如果你想學點東西沒有方向,建議你去學Python!   如果你對目前的工作不滿意,建議你去學Python!   說了這麼多,到底什麼是Python?
  • Python2 已終結,入手Python 3,你需要這30個技巧
    這篇教程有 30 個你會喜歡的方法。勤勞的程式設計師們,這裡有 30 條使用 Python 時實用的建議和小技巧。你可以把讀這篇文章當做工作間隙的小憩,而且我保證你學到的東西會跟工作時一樣多。1.檢查你的對象佔用了多少內存你可以使用 sys.getsizeof() 來查看你創建的對象佔用的內存大小:哇,等一下,為什麼這麼大的 list 只有 48 字節?這是因為 range 函數隻返回了一個類似 list 的類。
  • 這些Python代碼技巧,你肯定還不知道
    選自FreeCodeCamp作者:Peter Gleeson機器之心編譯參與:路、王淑婷被人工智慧捧紅的 Python 已是一種發展完善且非常多樣化的語言,其中肯定有一些你尚未發現的功能。本文或許能夠讓你學到一些新技巧。
  • 為什麼你總是學不會Python,入門Python的4大陷阱ython,因為你全掉坑了
    其實,學習這些語法不是要你去記憶怎麼寫,大部分時候這些語法語句不需要我們親手敲出每個字母,因為現在的 ide 都非常友好,一般都能提供生成代碼段的功能,如下是 vscode 的演示:你可能覺得這個事情非常簡單,不就是從頭開始,每本書都看看作者名字,符合就拿出來?這個思考過程實際就是從整體到細節的過程:首先,你會考慮從哪裡開始找,總有個搜索方向。
  • 為什麼我建議你一定要學Python?
    因為現在每家公司,都很需要數據分析方面的人才,這些技能崗如果單獨招人,又是起碼一兩萬的成本。而能夠掌握多項硬技能的全能人才,首先說明他的自我驅動力很強,另外,他真的一個人可以做幾個人的活,可以幫公司省不少錢。如果你現在業餘時間挺多的,想學點東西,但又不知道學啥好,建議你去學一項剛需或者急需的硬技能。
  • 開課吧:Python是什麼意思?為什麼有那麼多人學Python?
    為什麼那麼多人學Python?舉例:同在公司同一崗位的兩個人,老闆需要過往一年的數據進行復盤分析,不懂的只能按照以前整理的慢慢來,更多可能沒整理需要自己去慢慢一格格的看,然後用表格寫一大堆數據然後自己分析,兩三天是肯定的。
  • 成都python周末培訓班解疑周圍人都在學Python,要不要跟風?
    成都python周末培訓班解疑周圍人都在學Python,要不要跟風?為什麼要學 Python?周圍人都在學Python,要不要跟風?對於計算機專業和非計算機專業的同學來說,Python有什麼不一樣呢?有的時候學些東西僅僅就是 have a fun 而已。每次都當你有需求的時候再學永遠都會落後一拍,而且無法站在一個高度去選擇。舉個例子:比如你現在要寫個手機遊戲,現在有Unity、cocos2d、cocos2d-x、cocos2d-x lua 及其他引擎可供選擇。如果你從來都沒有用過這幾個東西你怎麼選擇?
  • 你為什麼一定要學Python?
    很多初學者都聽說python很火,可是為啥要學Python,下面談談我的感悟。風格統一,非常優美.而且內置了很多高效的庫,打個比方,同樣一項工作C語言可能要1000行,java要100行,python可能只要10行. 而且從桌面應用,web開發,自動化測試運維,爬蟲,人工智慧,大數據處理都能做,以後會詳細講一下.
  • python機器學習生物信息學
    課程介紹python機器學習生物信息學系列課程包含《python機器學習-乳腺癌細胞挖掘》,《python機器學習-糖尿病數據挖掘》,《呆瓜半小時入門python數據分析》三門課程,共300集左右,定期更新。
  • Python入門基礎之map()、reduce()函數使用
    本文環境都是基於python3.X的,畢竟要學會擁抱未來,擁抱新的知識。Python3 現在已經發展的差不多了。1、 map()函數map()是 python 內置的高階函數,它接收一個函數 f 和一個 list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的object並返回。
  • 對待python熱,你需要不是一杯奶茶錢,而是保持理性
    04入門編程,選擇語言,也要選對方向外行想入門計算機編程,一定要想好自己的興趣,明確自己的目標,想學哪個方向。為了以後能給自己小孩補習編程,因為現在小學生課程表裡也有了python這門課,說不定以後編程就納入高考科目了。看著朋友圈廣告「僅僅需要一杯奶茶錢,就能入門python編程,就能入門人工智慧」。是不是非常心動,很想把它買下來放到自己的硬碟上?是不是發現,不學python編程,感覺都快被時代拋棄了?
  • Python和java工程師哪個薪資高,看完這篇文章你就知道啦!
    目前主流程式語言有python、java、C++,那麼,今天我們來看看python和java的薪資待遇怎麼樣?為你以後學習就業找準方向。Python的需求和供給正因為Python在大數據和人工智慧領域的爆發性發展, 導致Python 方向崗位的薪水在水漲船高,成為目前最有潛力的程式語言之一。目前國內python人才需求呈大規模上升,薪資水平也水漲船高。學python的人大多非科班出身。
  • 想學習Python開發,你要先懂Python是什麼?
    首先我們要清楚一個點,那就是無論學習什麼東西,最主要的還是需要有足夠新穎跟得上時代需求的內容!不然,怎麼學也都是白費!想學習Python開發,你要先懂Python到底是什麼?他有那些優點?學習之後能從事什麼?接下來,就讓千鋒上海帶你詳細了解!
  • 地產大佬潘石屹開始學Python了-還不學python-你就要被淘汰了
    地產大佬潘石屹相信很多人都知道這個傳奇人物,而在這幾個月內地產大佬潘石屹通過微博向大眾宣布其將開始學習python程式語言。再加上python目前已經超過java,成為了程式語言排行榜第一,python這麼火,你還不學python等著被淘汰嗎?
  • 10個你必須知道的Python內置函數
    ,我們知道直接用for循環去迭代列表時,是拿不到元素下標位置的,而 enumerate 就可以獲取,否則你還得自己去定義一個索引變量。print(index, w)0 python1 is2 the3 best4 programming5 language4. map()map是一個與reduce函數對應的函數,Google的map/reduce框架的思想其實就是從這兩個函數借鑑而來的
  • 初學者python該怎麼學,讓我來告訴你,你要知道的都在這裡
    或許是因為這種萬能屬性,現在有很多的小夥伴都開始學習 Python。而現在 Python 的火爆甚至已經來到了程式設計師的圈子外,進入了國務院《新一代人工智慧發展規劃的通知》裡。Python 也已經走進了小學生的課程裡,其實不只是小學生,為了自己的發展前景,或許你才是最該學 Python 的人。