在Python中,我們經常需要創建列表。比如,想生成1到10的平方數,或者從一個列表中篩選出偶數。如果用傳統的for循環和append()方法,代碼可能會比較冗長。有沒有更簡單的方式呢?答案是:列表推導式!
什麼是列表推導式?¶
列表推導式是Python中一種簡潔創建列表的方法,它允許我們在一行代碼中完成循環和元素處理,生成新的列表。簡單來說,就是用更少的代碼實現列表的創建。
爲什麼要用列表推導式?¶
舉個例子:如果想生成1到10的平方數,傳統方法需要寫循環和append():
# 傳統方法
squares = []
for i in range(1, 11): # 循環1到10
squares.append(i ** 2) # 計算平方並添加到列表
print(squares) # 輸出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
而用列表推導式,只需一行代碼:
# 列表推導式
squares = [i ** 2 for i in range(1, 11)]
print(squares) # 輸出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
好處:代碼更簡潔、可讀性更高,不需要重複寫append(),一行搞定列表創建。
基本語法結構¶
列表推導式的核心格式是:
[表達式 for 變量 in 可迭代對象]
- 表達式:對變量的操作(比如
i**2、i*2、字符串處理等),最終結果會成爲列表的元素。 - 變量:循環中的每個元素(比如
i,可以是任何合法的變量名)。 - 可迭代對象:能被循環遍歷的對象(比如
range()、列表、元組等,常見的是range())。
不帶條件的列表推導式¶
如果只想對可迭代對象中的每個元素做統一處理(無篩選),直接用基本語法即可。
例子1:生成1到10的平方數
squares = [i ** 2 for i in range(1, 11)]
print(squares) # 輸出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
例子2:生成1到5的偶數倍
even_multiples = [i * 2 for i in range(1, 6)] # i從1到5,每個乘2
print(even_multiples) # 輸出:[2, 4, 6, 8, 10]
帶條件的列表推導式¶
如果需要篩選元素(比如只保留偶數),可以在語法後加上if 條件。格式變爲:
[表達式 for 變量 in 可迭代對象 if 條件]
例子3:篩選1到10中的偶數
傳統方法:
evens = []
for i in range(1, 11):
if i % 2 == 0: # 判斷是否爲偶數
evens.append(i)
print(evens) # 輸出:[2, 4, 6, 8, 10]
列表推導式:
evens = [i for i in range(1, 11) if i % 2 == 0]
print(evens) # 輸出:[2, 4, 6, 8, 10]
例子4:篩選大於3的偶數
result = [i for i in range(1, 11) if i > 3 and i % 2 == 0]
print(result) # 輸出:[4, 6, 8, 10]
更靈活的表達式¶
列表推導式的“表達式”可以是任何合法的Python操作,比如字符串處理、函數調用等。
例子5:將列表中的名字轉爲大寫
names = ['alice', 'bob', 'charlie']
upper_names = [name.upper() for name in names] # name.upper()是字符串大寫方法
print(upper_names) # 輸出:['ALICE', 'BOB', 'CHARLIE']
例子6:對列表中的數字取絕對值
numbers = [-1, 2, -3, 4, -5]
abs_numbers = [abs(num) for num in numbers] # abs()是取絕對值函數
print(abs_numbers) # 輸出:[1, 2, 3, 4, 5]
注意:列表推導式 vs 生成器表達式¶
- 列表推導式:用
[],直接生成完整列表,佔用內存。 - 生成器表達式:用
(),生成的是“惰性序列”,需逐個迭代,節省內存。初學者先掌握列表推導式即可。
總結¶
列表推導式的核心優勢是簡潔高效,能讓代碼更緊湊、可讀性更強。通過對比傳統循環和列表推導式,你會發現它能大幅減少代碼量。
練習建議:嘗試用列表推導式改寫之前用for循環+append()的代碼,比如生成1到20的立方數、篩選列表中的負數等。多練幾次,就能熟練掌握這種寫法啦!