Python map() 函数,举例说明

本指南將深入探討如何運用 Python 的 map() 函式,將特定函式應用於可迭代對象的每個元素。

Python 支援函數式程式設計範式,允許您將運算任務定義為函數的形式。在 Python 中,函數被視為物件,這意味著您可以將一個函數作為參數傳遞給另一個函數,並讓函數返回另一個函數。

map() 函式接受一個函式作為輸入參數,並將該函式應用於序列中的所有元素。

學完本指南後,您將能靈活運用 Python 的 map() 函式,簡化冗長的迴圈和列表推導式。您將透過實例學習 map() 函式的多種應用方式。

如何將函式應用於 Python 列表的元素

讓我們從一個具體範例開始。 👩‍🏫

這裡,nums 是一個數值列表。

nums = [2,4,3,7]

接著,考慮 self_pow() 函式。此函式接收一個數值作為輸入,並返回該數值的自身次方,即 nn

在 Python 中,** 是乘冪運算符。 a**b 返回 a 的 b 次方,也就是 ab

def self_pow(n):
  return n**n

您的任務是:將 self_pow() 函式應用於列表 nums 中的每個元素,並建立一個新的列表 nums_pow

使用 for 迴圈

要達成此目的,您可以使用 Python 的 for 迴圈:

  • 遍歷列表 nums 中的每個數值,並將其作為參數傳遞給 self_pow() 函式。
  • 將每次函數調用的結果附加到新的列表 nums_pow
nums_pow = []

for num in nums:
  nums_pow.append(self_pow(num))

print(nums_pow)

在輸出結果中,每個數值都被計算了自身次方。 nums_pow 列表中的元素會是:22、44、33、77

Output
[4, 256, 27, 823543]

使用列表推導

您也可以使用列表推導式,以更簡潔的方式完成相同的操作。 從上面的 for 迴圈中,我們可以找出輸出的表達式和需要迭代的列表。

然後,我們可以套用列表推導式的一般形式:

new_list = [<輸出表達式> for item in 可迭代對象]

因此,產生 nums_pow 列表的列表推導式如下:

nums_pow = [self_pow(num) for num in nums]
print(nums_pow)

如同預期,輸出結果與使用 for 迴圈的輸出相同。

Output
[4, 256, 27, 823543]

除了迴圈和列表推導式,您還可以利用 Python 的 map() 函式,其語法更加簡潔,且能協助將函數應用於可迭代對象的所有元素。 讓我們從 map() 函式的語法開始學習。

Python map() 函式語法

使用 Python map() 函式的一般語法如下:

map(function, iterable_1,[iterable_2,...,iterable_n])

map() 函式至少接受兩個參數:一個函式和一個可迭代物件。

在上述語法中:

  • function 代表 Python 函式,更廣泛地說,它可以是任何可呼叫的 Python 物件,例如使用者定義的函式、內建函式、類別、實例以及類別方法等。
  • iterable 指任何有效的 Python 可迭代物件,例如列表、元組和字串。
  • map() 函式會將 function 應用於可迭代物件的每個元素。

map() 函式的返回值是什麼?

它會返回一個「地圖物件」。您可以透過 list(map(function,iterable)) 這樣的語法將地圖物件轉換為列表。

根據實際應用情境,您也可以將其轉換為 Python 元組。

現在您已經了解了 Python map() 函式的語法,讓我們開始撰寫一些範例。

建議您使用 Python 3.x 來學習本指南。若您沒有 Python 環境,您可以在 techblik.com 的線上 Python 編輯器中執行程式碼片段。

如何將 map() 函式與使用者定義的函式一起使用

#1. 我們之前將 self_pow() 函式應用於 nums 列表中的每個數字。 在 map() 函式的語法中,我們可以傳入 self_pow 函式和 nums 列表作為參數。

請注意:您應該只指定函式的名稱,而非函式呼叫。 使用 self_pow 而不是 self_pow()

map() 函式會返回一個地圖物件。

print(map(self_pow,nums))

<map object at 0x7f7d315c14d0>

接著,我們可以使用 list() 函式將地圖物件轉換為列表,如下所示。

nums_pow = list(map(self_pow,nums))
print(nums_pow)

此處的輸出結果是將 nums 中的每個數字 num 映射到 nums_pow 列表中的 numnum

Output
[4, 256, 27, 823543]

#2. 考慮以下將英吋轉換為公分的函式 inch_to_cm()。 1 英吋 = 2.54 公分。

def inch_to_cm(inch):
  return inch*2.54

若要將英吋列表中的數值轉換為公分,您可以使用 map() 函式,如下列程式碼所示。

inches = [5.54,3.4,1,25,8.2]
cms = list(map(inch_to_cm,inches))
print(cms)

cms 列表包含了以公分為單位的英吋數值。

Output
[14.0716, 8.636, 2.54, 63.5, 20.828]

如何使用帶有內建函式的 map() 函式

在本節中,我們將學習如何在 Python 中將 map() 函式與內建函式搭配使用。

#1. 假設有一個程式語言的字串列表 strings,您想要建立一個新的列表 strings_upper,其中包含大寫的程式語言字串。

strings = ['JavaScript','Rust','Python','Go']

內建的字串方法 .upper() 會對字串進行操作,並返回大寫格式的副本。

strings_upper = list(map(str.upper,strings))
print(strings_upper)

列表 strings_upper 包含了以大寫格式化的 strings 列表中的字串。

Output
['JAVASCRIPT', 'RUST', 'PYTHON', 'GO']

#2. Python 中的內建函式 len() 接受一個序列作為參數並返回其長度。 若要找出字串列表中每個字串的長度,我們可以利用 map() 函式,並將 len 函式應用於每個字串,如下所示。

strings_len = list(map(len,strings))
print(strings_len)
Output
[10, 4, 6, 2]

#3. 您可以將 map() 函式與元組等其他集合一起使用。

以下範例包含一個元組,其中包含關於臥室數量、房屋面積以及房屋所在城市的資訊。

在 Python 中,函式 type() 會返回任何 Python 物件的資料類型。 若要取得這個元組中所有項目的資料類型,您可以使用 map() 函式,並對每個元組項目調用 type 函式。

house = (2,758.5,'Bangalore')
house_elt_type = tuple(map(type,house))
print(house_elt_type)

我們已經將地圖物件轉換為元組。 您也可以將其轉換為列表或任何其他集合。

在以下輸出中,我們可以看到 2、758.5 和 Bangalore 的資料類型分別被推斷為「int」、「float」和「str」。

Output
(<class 'int'>, <class 'float'>, <class 'str'>)

#4. 在 Python 中,您可以匯入內建模組,並使用模組中定義的函式。

若要計算 nums 列表中每個數值的平方根,您可以使用 math 模組中的平方根函式 sqrt

import math
nums = [30,90,34,45,97]
nums_sqrt = list(map(math.sqrt,nums))
print(nums_sqrt)
Output
[5.477225575051661, 9.486832980505138, 5.830951894845301, 6.708203932499369, 9.848857801796104]

上面的輸出難以解析和閱讀。 您可能希望將每個平方根值四捨五入到小數點後兩位。

如何在 Python 中對浮點數進行捨入

讓我們定義一個函式 round_2(),它接收一個浮點數值,並將其四捨五入到小數點後兩位。

def round_2(num):
  return round(num,2)

現在,您可以將 map() 函式與 round_2nums_sqrt 列表一起使用。

nums_sqrt_round = list(map(round_2,nums_sqrt))
print(nums_sqrt_round)
Output
[5.48, 9.49, 5.83, 6.71, 9.85]

您也可以使用巢狀的 map() 函式,其中內部的 map 函式用於計算平方根列表 nums_sqrt,而外部的 map 函式執行捨入操作。

nums_sqrt_round = list(map(round_2,list(map(math.sqrt,nums))))
print(nums_sqrt_round)
Output
[5.48, 9.49, 5.83, 6.71, 9.85]

以上兩種方法的輸出結果相同。 不過,您應該確保在嵌套函式時,程式碼的可讀性和可維護性,如上所示。

如何在 Lambda 函式中使用 map() 函式

在前面的章節中,您學習了如何將 Python 的 map() 函式與內建函式和使用者定義的函式一起使用。 現在,您將學習如何將 map() 函式與 lambda 函式一起使用,lambda 函式在 Python 中是匿名的。

有時候,您可能會遇到函式的主體僅包含一行程式碼,且您可能只需要使用該函式一次,而無需在程式的其他地方引用它。 您可以在 Python 中將這類函式定義為 lambda 函式。

請注意:lambda args: 表达式 是使用 Python lambda 函式的一般語法。

#1. 考慮以下字串列表。 假設您想要得到一個列表 strings_rev,其中包含每個字串的反向副本。

strings = ['JavaScript','Rust','Python','Go']

我們可以透過字串切片來反轉 Python 字串。

請注意:這是對字串切片表達式 str[start:stop:step] 的一般化。

  • 如果沒有提供 startstop 值,則切片會從字串的開頭開始,並延伸到字串的結尾。
  • step 的負值表示從字串的結尾開始切片。
  • 因此,str[::-1] 會返回 str 的反向副本。

您可以將這個 lambda 函式:lambda x:x[::-1] 放入 map 函式中,如下所示。

strings_rev = list(map(lambda x:x[::-1],strings))
print(strings_rev)

與其他範例一樣,我們將地圖物件轉換為列表。 在輸出結果中,我們可以看到列表 strings 中的每個字串都已被反轉。

Output
['tpircSavaJ', 'tsuR', 'nohtyP', 'oG']

#2. 在上一節中,我們計算了數字列表中每個數字的平方根,然後將每個平方根值四捨五入到小數點後兩位。

我們使用 round_2() 函式來做到這一點。 讓我們將 round_2() 函式重寫為 lambda 函式,並將其與以下描述的 map() 函式一起使用。

nums_sqrt_round_l =list(map(lambda num:round(num,2),nums_sqrt))
print(nums_sqrt_round_l)

如下所示,輸出結果與我們使用 round_2() 函式獲得的結果相同。

Output
[5.48, 9.49, 5.83, 6.71, 9.85]

如何使用具有多個可迭代物件的 map() 函式

在我們看到的範例中,我們將一個函式應用於剛好一個可迭代物件的所有項目。

有時候,我們可能會遇到接收兩個或多個參數的函式。 在這種情況下,每個參數都儲存在列表或類似的集合中。

我們也可以將 Python 的 map() 函式與多個列表一起使用。

#1. 考慮以下函式 area(),它接收長度和寬度作為輸入,並返回面積,即 長度 * 寬度。

def area(length,breadth):
  return length*breadth

不同矩形的長度和寬度分別儲存在兩個獨立的列表 lengthsbreadths 中。

lengths = [4,8,10,18]
breadths = [9,4,6,11]

我們可以利用 map() 函式,透過傳入 lengthsbreadths 列表,將面積函式應用於上述列表。

areas = list(map(area,lengths,breadths))
print(areas)

因為 area 函式接收兩個參數,所以會分別從 lengthsbreadths 列表中使用長度和寬度的值。

Output
[36, 32, 60, 198]

#2. Python 的數學模組具有 log 函式,可協助我們計算數字對於任何底數的對數。

請注意:log(x, base) 會將 x 的對數值返回到由值 base 指定的底數,即 logbase x。 如果沒有指定底數,則預設底數值為 e (對數計算會使用自然對數)。

在這個範例中:

  • 列表 x 對應於您想要計算對數的值。
  • 列表 base 包含要在對數計算中使用的所有底數值。
x = [2,6,12,10]
base = [2,3,2,5]

我們可以利用 Python 的 map() 函式與 math.log、列表 xbase,來取得新的列表 log_x,如下所示。

log_x = list(map(math.log,x,base))
print(log_x)

以下是輸出結果。

Output
[1.0, 1.6309297535714573, 3.5849625007211565, 1.4306765580733933]

結論

以下是您在本指南中所學內容的摘要:

  • Python 的 map() 函式至少接收兩個參數:一個函式和一個可迭代物件,其語法為 map(function, iterable(s))
  • 該函式可以是任何有效的 Python 可呼叫物件。
  • 當函式接收 k 個參數時,將 map() 函式與該函式以及每個可迭代物件的 k 個參數一起使用。

接下來,學習如何在 Python 中使用集合。