本指南將深入探討如何運用 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_2
和 nums_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]
的一般化。
- 如果沒有提供
start
和stop
值,則切片會從字串的開頭開始,並延伸到字串的結尾。 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
不同矩形的長度和寬度分別儲存在兩個獨立的列表 lengths
和 breadths
中。
lengths = [4,8,10,18] breadths = [9,4,6,11]
我們可以利用 map()
函式,透過傳入 lengths
和 breadths
列表,將面積函式應用於上述列表。
areas = list(map(area,lengths,breadths)) print(areas)
因為 area
函式接收兩個參數,所以會分別從 lengths
和 breadths
列表中使用長度和寬度的值。
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
、列表 x
和 base
,來取得新的列表 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 中使用集合。