目錄
一、推導式介紹
二、推導式的用法
2.1?列表推導式?
2.2?字典推導式?
2.3 集合推導式?
2.4?生成器表達式?
三、推導式的嵌套和復雜用法
3.1 嵌套推導式
3.2 多重條件推導式
四、推導式對比傳統循環
4.1 性能比較
4.2 可讀性比較
五、常見應用場景
5.1 數據清洗和轉換
5.2 文件處理
5.3 API數據處理
六、注意事項
參考
一、推導式介紹
????????Python推導式(Comprehension)是一種簡潔、優雅的語法結構,可以用單行代碼快速創建列表、字典、集合等數據結構。它基于現有的可迭代對象,通過表達式和條件語句來生成新的數據集合。
不僅讓代碼更加簡潔易讀,而且在大多數情況下比傳統的循環方式執行效率更高。
二、推導式的用法
????????Python 推導式是一種獨特的數據處理方式,可以從一個數據序列構建另一個新的數據序列的結構體。
Python 支持推導式的數據結構有:
- 列表(list)推導式
- 字典(dict)推導式
- 集合(set)推導式
- 元組(tuple)推導式
2.1?列表推導式?
列表推導式是最常見的形式,用于創建新的列表。
基本語法:
[expression for item in iterable if condition]
示例:
# 傳統方式
squares = []
for x in range(10):squares.append(x**2)# 列表推導式
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
帶條件的列表推導式:
# 只保留偶數平方
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]# 使用條件表達式
results = ["偶數" if x % 2 == 0 else "奇數" for x in range(5)]
print(results) # ['偶數', '奇數', '偶數', '奇數', '偶數']
嵌套循環的列表推導式:
# 生成所有可能的坐標對
coordinates = [(x, y) for x in range(3) for y in range(3)]
print(coordinates) # [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
2.2?字典推導式?
字典推導式用于創建字典,語法與列表推導式類似。
基本語法:
{key_expression: value_expression for item in iterable if condition}
示例:
# 創建數字到其平方的映射
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}# 反轉字典的鍵和值
original = {'a': 1, 'b': 2, 'c': 3}
reversed_dict = {v: k for k, v in original.items()}
print(reversed_dict) # {1: 'a', 2: 'b', 3: 'c'}# 帶條件的字典推導式
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares) # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
2.3 集合推導式?
集合推導式用于創建集合,會自動去除重復元素。
基本語法:
{expression for item in iterable if condition}
示例:
# 從列表中創建不重復的平方數集合
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_squares = {x**2 for x in numbers}
print(unique_squares) # {16, 1, 9, 4}# 帶條件的集合推導式
even_squares = {x**2 for x in range(10) if x % 2 == 0}
print(even_squares) # {0, 64, 4, 36, 16}
2.4?生成器表達式?
生成器表達式使用圓括號,與列表推導式類似,但返回一個生成器對象,按需生成值,節省內存。
基本語法:
(expression for item in iterable if condition)
示例:
# 創建生成器
squares_gen = (x**2 for x in range(10))# 使用生成器
print(next(squares_gen)) # 0
print(next(squares_gen)) # 1# 可以轉換為列表
print(list(squares_gen)) # [4, 9, 16, 25, 36, 49, 64, 81]# 在函數中使用
total = sum(x**2 for x in range(10))
print(total) # 285
三、推導式的嵌套和復雜用法
3.1 嵌套推導式
# 二維列表展平
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]# 轉置矩陣
transposed = [[row[i] for row in matrix] for i in range(3)]
print(transposed) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
3.2 多重條件推導式
# 多個條件
numbers = [x for x in range(20) if x % 2 == 0 if x % 3 == 0]
print(numbers) # [0, 6, 12, 18]# 復雜的條件表達式
categorized = ["大偶數" if x > 5 and x % 2 == 0 else "小偶數" if x % 2 == 0 else "大奇數" if x > 5 else "小奇數" for x in range(10)]
print(categorized)
四、推導式對比傳統循環
4.1 性能比較
推導式通常比等效的循環更快,因為它們在底層使用了優化的C代碼。
import timeit
# 測試列表推導式性能
list_comp_time = timeit.timeit('[x**2 for x in range(1000)]', number=10000)
loop_time = timeit.timeit('''
result = []
for x in range(1000):result.append(x**2)
''', number=10000)print(f"列表推導式: {list_comp_time:.3f}秒")
print(f"傳統循環: {loop_time:.3f}秒")
4.2 可讀性比較
雖然推導式更簡潔,但過度復雜的推導式可能會降低可讀性:
# 可讀性好的推導式
good_example = [x**2 for x in range(10) if x % 2 == 0]# 過于復雜的推導式(不推薦)
bad_example = [[x*y for y in range(10) if y % 2 == 0] for x in range(10) if x % 3 == 0]
建議:當推導式變得復雜難以理解時,考慮使用傳統的循環結構。
五、常見應用場景
5.1 數據清洗和轉換
# 從字符串中提取數字并轉換為整數
data = ["價格: 100元", "重量: 2.5kg", "數量: 15個"]
numbers = [float(''.join(filter(str.isdigit, item))) for item in data]
print(numbers) # [100.0, 25.0, 15.0]
5.2 文件處理
# 讀取文件并處理行
with open('data.txt', 'r') as file:lines = [line.strip().upper() for line in file if line.strip()]
5.3 API數據處理
# 從API響應中提取特定信息
api_response = [{'name': 'Alice', 'age': 25, 'active': True},{'name': 'Bob', 'age': 30, 'active': False},{'name': 'Charlie', 'age': 35, 'active': True}
]active_users = [user['name'] for user in api_response if user['active']]
print(active_users) # ['Alice', 'Charlie']
六、注意事項
-
避免過度復雜:如果推導式變得難以閱讀,考慮使用傳統循環
-
注意內存使用:大型數據集考慮使用生成器表達式
-
保持可讀性:適當的空格和換行可以提高復雜推導式的可讀性
-
不要濫用:推導式不是所有循環的替代品,選擇合適的工具
# 可讀性更好的復雜推導式
result = [(x, y, z)for x in range(10)for y in range(10)for z in range(10)if x + y + z > 15and x % 2 == 0and y % 2 != 0
]print(result)
參考
-
Python官方文檔 - 列表推導式
-
Real Python - Python列表推導式指南
-
Stack Overflow - 列表推導式最佳實踐討論