Python - 列表理解:初學者的友善指南

你好,有抱負的 Python 程式設計師!很高興能夠在這個令人興奮的 Python 列表理解旅程中成為你的嚮導。作為一個教了多年 Python 的人,我告訴你,這個主題就像學習你的代碼的祕密超能力一樣。所以,讓我們一起深入探究,並解鎖這個精彩的功能!

Python - List Comprehension

Python 中的列表理解

想像一下,你在一個超市裡,需要從一大籃子混合水果中挑出所有紅色的蘋果。這基本上就是 Python 中的列表理解所做的——它幫助你通過從現有列表中挑選特定項目,以一行整潔的代碼創建一個新列表!

讓我們從一個簡單的例子開始:

fruits = ["apple", "banana", "cherry", "date", "elderberry"]
long_fruits = [fruit for fruit in fruits if len(fruit) > 5]
print(long_fruits)

輸出:

['banana', 'cherry', 'elderberry']

在這個例子中,我們創建了一個新的列表 long_fruits,其中只包含名稱超過 5 個字符的水果。讓我們來分解一下:

  1. fruit for fruit in fruits:這部分就像在說“對我們籃子裡的每個水果”
  2. if len(fruit) > 5:這是我們的條件,就像在說“但只有當水果的名稱超過 5 個字母時”
  3. 整個東西被方括號 [] 包圍,這告訴 Python 用結果創建一個新列表

這不就是魔法嗎?僅用一行,我們就完成了通常需要多行使用傳統 for 迴圈的工作。

列表理解與 Lambda

現在,讓我們提升一下水平。有時我們想做的不仅仅是挑選項目;我們還想轉換它們。這就是 lambda 函數派上用場的地方。將 lambda 視為我們可以使用的一次性迷你函數。

這裡有一個例子:

numbers = [1, 2, 3, 4, 5]
squared_numbers = [lambda x: x**2 for x in numbers]
print([func() for func in squared_numbers])

輸出:

[1, 4, 9, 16, 25]

在這個例子中,我們創建了一個 lambda 函數列表,它們各自對每個數字進行平方。然後,我們調用這些函數以獲得最終結果。這就像擁有一支迷你機器人隊伍,每個機器人都被編程去平方一個數字!

Python 列表理解中的巢狀迴圈

有時,生活會變得複雜一點,我們的代碼也是。如果我們需要同時處理多個列表呢?這就是巢狀迴圈在列表理解中的用處。

假設我們正在規劃一個派對,並希望將不同的水果與不同的飲料搭配:

fruits = ["apple", "banana", "cherry"]
drinks = ["juice", "smoothie", "cocktail"]
combinations = [(fruit, drink) for fruit in fruits for drink in drinks]
print(combinations)

輸出:

[('apple', 'juice'), ('apple', 'smoothie'), ('apple', 'cocktail'),
('banana', 'juice'), ('banana', 'smoothie'), ('banana', 'cocktail'),
('cherry', 'juice'), ('cherry', 'smoothie'), ('cherry', 'cocktail')]

這個理解就像擁有兩個旋轉輪盤,一個用於水果,一個用於飲料。對於每種水果,我們都完全旋轉飲料輪盤,創建所有可能的組合。這是派對規劃者的夢想!

Python 列表理解中的條件語句

現在,讓我們在列表理解中添加一些決策。我們可以使用 if-else 語句來使我们的選擇更加具體。

想像我們正在評分考試,並希望將分數分類為“通過”或“失敗”:

scores = [65, 80, 90, 45, 75, 55]
results = ['pass' if score >= 60 else 'fail' for score in scores]
print(results)

輸出:

['pass', 'pass', 'pass', 'fail', 'pass', 'fail']

在這裡,我們在列表理解中使用了一個三元運算符 (x if condition else y)。這就像每個分數都有一个小法官,決定它是通過還是失敗。

列表理解與 For 迴圈

現在,你可能在想,“我們有很好的舊 for 迴圈,為什麼要麻煩使用列表理解?”很好的問題!讓我們比較一下:

# 使用 for 迴圈
squares_loop = []
for i in range(10):
squares_loop.append(i**2)

# 使用列表理解
squares_comp = [i**2 for i in range(10)]

print("For 迴圈結果:", squares_loop)
print("列表理解結果:", squares_comp)

輸出:

For 迴圈結果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
列表理解結果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

正如你所看到的,兩種方法都產生了相同的結果。但是列表理解在一行中完成,使我们的代碼更簡潔,一旦你習慣了語法,通常也更容易閱讀。

列表理解的優點

讓我們總結一下列表理解為什麼如此棒:

  1. 可讀性:一旦熟悉它們,列表理解通常更容易一眼閱讀。
  2. 簡潔性:它們允許你用一行寫出通常需要 3-5 行的內容。
  3. 速度:在許多情況下,列表理解比等價的 for 迴圈更快。
  4. 靈活性:它們可以結合條件、巢狀迴圈甚至函數調用。

以下是我们涵盖的方法的摘要表:

方法 描述 示例
基本列表理解 根據現有列表創建新列表 [x for x in range(10)]
帶條件的列表理解 篩選項目的同時創建新列表 [x for x in range(10) if x % 2 == 0]
帶 Lambda 的列表理解 在理解中使用迷你函數 [(lambda x: x**2)(x) for x in range(5)]
巢狀列表理解 同時處理多個列表 [(x, y) for x in [1,2,3] for y in [3,1,4]]
帶 If-Else 的列表理解 對每個項目進行決策 ['even' if x % 2 == 0 else 'odd' for x in range(5)]

請記住,像任何強大的工具一樣,列表理解應該明智地使用。雖然它們在許多情況下都很好,但有時傳統的 for 迴圈可能更合適,特別是對於更複雜的操作或當可讀性至關重要時。

所以,這就是,我親愛的學生們!你們剛剛解鎖了一個新的 Python 超能力。列表理解可能一開始看起來有點複雜,但隨著練習,它們會變得 second nature。很快,你們就會寫出優雅、高效的代碼,讓其他程式設計師說:“哇,你是怎麼做到的?”繼續練習,保持好奇,並且編程愉快!

Credits: Image by storyset