Comprehension 是什麼?
Python 的資料建構式/推導式(Comprehensions)是一種簡潔且具表達力的方式來建立列表、集合、字典或生成器。
這些語法結構通常包含條件邏輯,讓我們能夠在一行內完成資料篩選、轉換和構建。
如果還不了解列表 字典 集合 請先看下面的文章 了解基本概念:
Python {dictionaries 字典} Dict Comprehension
Python 列表 [list] List Comprehension 快速生成列表
Python {Sets 集合}和推導式 (Comprehension)
資料建構式種類 | 語法範例 | 用途 |
---|---|---|
列表建構式 | [x for x in iterable if condition] |
產生列表,適合需多次訪問的數據 |
集合建構式 | {x for x in iterable if condition} |
產生集合,去除重複值 |
字典建構式 | {k: v for k, v in iterable if cond} |
產生字典,適合鍵值對映射數據 |
生成器建構式 | (x for x in iterable if condition) |
產生生成器,適合大量數據惰性求值 |
特性 | 列表建構式 | 集合建構式 | 字典建構式 | 生成器建構式 |
---|---|---|---|---|
語法符號 | [ ] |
{ } |
{ } |
( ) |
輸出資料類型 | list |
set |
dict |
generator |
元素是否唯一 | 否 | 是 | 是(依鍵來唯一) | 否 |
條件篩選 | 支援 | 支援 | 支援 | 支援 |
記憶體效率 | 中等 | 中等 | 中等 | 高 |
x =[1,2,3,4]
squared_x = []
for item in x:
squared_x.append(item * 2)
print(squared_x) #[2, 4, 6, 8]
squared_x = [item**2 for item in x]
列表推導式是一種在單行中創建列表的語法。適合用來創建列表,語法清晰,速度通常比傳統的 for 迴圈快。
語法:new_list = [expression for item in iterable if condition]
# 創建一個包含0到9的平方數的列表
# 範例:產生平方數列表
squares = [x**2 for x in range(10)]
# 結果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 創建一個包含所有偶數的列表
even_numbers = [x for x in range(20) if x % 2 == 0]
print(even_numbers)
#[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 創建一個包含所有大寫字母的列表
upper_letters = [letter.upper() for letter in 'hello world']
print(upper_letters )
#['H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D']
使用大括號 {}
,並且需指定鍵:值對,適合用來生成基於某邏輯的字典。
語法:new_dict = {key: value(operation) for item in iterable if condition}
# 範例:將數字及其平方作為鍵值對
square_dict = {x: x**2 for x in range(10)}
# 結果: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
# 創建一個計算水果名稱長度的字典
fruit_lengths = {fruit: len(fruit) for fruit in ['apple', 'banana', 'cherry']}
print(fruit_lengths)
{'apple': 5, 'banana': 6, 'cherry': 6}
使用花括號 {}
包裹,適合用來去除重複元素並生成集合。new_ser={operation for variable in original_set if condition}
sentence = "This is a sample sentence to demonstrate set comprehension."
vowels = {char for char in sentence if char in 'aeiouAEIOU'}
print(vowels)#{'a', 'e', 'i', 'o', 'u'}
解釋:sentence = "This is a sample sentence to demonstrate set comprehension."
: 定義一個包含英文句子的字串。{char for char in sentence if char in 'aeiouAEIOU'}
: 這是集合建構式:char for char in sentence
: 迭代 sentence 中的每個字元,並將每個字元賦值給變數 char。if char in 'aeiouAEIOU'
: 判斷 char 是否為元音字母(不分大小寫)。vowels
: 將符合條件的字元放入一個集合中。集合會自動去除重複元素,因此最後 vowels 中只會包含不重複的元音字母。
執行結果:
這個範例展示了集合建構式的一些特點:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
odd_numbers_greater_than_5 = {num for num in numbers if num > 5 and num % 2 != 0}
print(odd_numbers_greater_than_5)#{7, 9}
生成器是一種特殊的迭代器。
它不像列表一次將所有元素存儲在內存中,而是在每次迭代時計算並返回下一個值。
這使得生成器非常適合處理大型資料集,因為它可以避免一次性將所有資料載入到記憶體中,從而節省記憶體。
使用小括號 ()
包裹,返回一個生成器。
生成器不會一次性將所有結果存入記憶體,而是每次迭代時生成一個值,非常適合處理大量數據。
# 範例:建立一個生成平方數的生成器
square_gen = (x**2 for x in range(10))
# <generator object <genexpr> at 0x78937779db60>
#
為什麼會看到這個輸出? <generator object at 0x78937779db60>
當你直接打印一個生成器對象時,Python 會顯示它的類型(generator object)和記憶體地址。
這告訴你,這是一個生成器,但它並不會顯示生成器中的元素
generator object
: 表示這是一個生成器對象。<genexpr>
: 表示這個生成器是通過生成器表達式(generator expression)創建的。0x78937779db60
: 是一個十六進位數字,代表這個生成器對象在記憶體中的具體位置。這個地址會隨著每次程式執行而改變。