HOWTO · Python

如何在 Python 中將函式應用於列表

在 Python 中將函式應用於列表主要有 4 種方法:for 迴圈、map() 函式、列表推導式和產生器運算式。

本頁內容

要將函式應用於 Python 列表中的每一個元素,就對每個元素呼叫該函式,並收集傳回的值。例如,將每個數字乘以 10,就會把 [1, 2, 3, 4] 變成 [10, 20, 30, 40]。你可以使用 for 迴圈、map()、列表推導式或產生器運算式。下面的範例使用相同的函式和輸入,方便你比較每種方法是如何產生或提供結果的。

使用 for 迴圈將函式應用於 Python 中的列表

for 迴圈讓每一步都一目瞭然:建立一個結果列表,對每個輸入呼叫函式,並把每個傳回值附加進去。當迴圈需要額外的敘述或分支時,這種方法很有用。下面的範例將函式應用於每個數字,並列印結果列表。

def multiply_by_ten(number):
    return 10 * number


numbers = [1, 2, 3, 4]
results = []

for number in numbers:
    results.append(multiply_by_ten(number))

print(results)

這個迴圈不會改變 numbers,而是把 results 建立為一個單獨的列表。你可以修改函式主體,來對自己的資料執行所需的轉換。

使用 map() 函式將函式應用於 Python 中的列表

Python 的 map() 函式 接受一個可呼叫物件和一個可疊代物件,然後逐個產出該可呼叫物件對每個元素的結果。在 Python 3 中,map() 傳回一個疊代器;當其餘程式碼需要列表時,把它包裝在 list() 中。

def multiply_by_ten(number):
    return 10 * number


numbers = [1, 2, 3, 4]
results = list(map(multiply_by_ten, numbers))
print(results)

當你已經有一個要應用的函式時,這種形式很簡潔。疊代器會隨著 list() 請求它的值而被消耗;如果你需要再次走訪這些值,就保留結果列表,或者再建立一個疊代器。

使用列表推導式將函式應用於 Python 中的列表

列表推導式 透過把每個元素的運算式放在 for 子句之前來建立一個新列表。它是 Python 的語言結構,而不是方法,在轉換可以清晰地寫在一行之內時,它是一種緊湊的選擇。

def multiply_by_ten(number):
    return 10 * number


numbers = [1, 2, 3, 4]
results = [multiply_by_ten(number) for number in numbers]
print(results)

運算式 multiply_by_ten(number) 決定每一個結果,而 for 子句提供每一個輸入元素。當只應包含選定的元素時,推導式還可以帶上一個條件。

使用產生器運算式將函式應用於 Python 中的列表

產生器運算式 是在類似推導式的運算式外加上圓括號。它在被請求時以惰性方式產出值,而不是立即建立一個結果列表。這樣可以避免一次性保存所有轉換後的值,不過把產生器轉換為列表會使這些值具體化。

def multiply_by_ten(number):
    return 10 * number


numbers = [1, 2, 3, 4]
results = (multiply_by_ten(number) for number in numbers)
print(list(results))

每個值都是在疊代過程中產生的。產生器在被走訪時會逐漸消耗完,因此對同一個產生器進行第二次走訪不會重複產出這些值;如果你需要重複使用它們,就建立一個新的產生器,或者把值存入列表。

結論

當你希望明確地控制每一步時,選擇 for 迴圈;當把一個現成的函式應用於可疊代物件是很自然的做法時,使用 map()。列表推導式用簡潔的語法直接建立一個新列表。當你希望惰性疊代、並且不需要一次性具體化每一個結果時,使用產生器運算式。這四種方法既可以呼叫內建函式,也可以呼叫你自己定義的函式;例如,推導式可以用 [str(item) for item in numbers] 把 str 應用於每個元素。