Mike的Python學院

Python

Mike Ku

Learn Code With Mike品牌創辦人

2021/10/23

Python Comprehension語法應用教學(下)

本文將延續「Python Comprehension語法應用教學(上)」,接續分享Python Comprehension語法的應用。
Q: Set & Dictionary Comprehension如何使用?
集合(Set)Comprehension的用法和串列(List)Comprehension幾乎一樣,不同的地方是集合(Set)使用 {} 符號,並且其中的元素不會重覆,如下範例:
titles = "Learn Code With Mike"
result = {letter for letter in titles if letter == "e"}
print(result) # 執行結果:{'e'}
從範例中可以看到 titles 中符合條件的 e 字母有3個,但是集合(Set)只會顯示1個。
另外,字典(Dictionary)Comprehension和集合(Set)Comprehension同樣使用 {} 符號,不同的是字典(Dictionary)的每個元素由鍵(Key)與值(Value)構成,如下範例:
titles = "Python"
result = {index: letter for index, letter in enumerate(titles)}
print(result) #執行結果{0: 'P', 1: 'y', 2: 't', 3: 'h', 4: 'o', 5: 'n'}
範例中利用enumerate()函式回傳可疊代的物件(Iterable Object)元組(Tuple),再透過Unpacking的方式取得鍵(index)與值(letter) 。
Q:Generator Expression如何使用?
各位一定會想說,那有元組(Tuple)Comprehension嗎?我們依照上面的原則來撰寫如下範例:
result = (number * 2 for number in range(10))
print(result) #執行結果<generator object <genexpr> at 0x006A2CD8>
從執行結果可以看到,我們得到了一個Generator物件(Object),這是什麼呢?
Generator物件(Object)具有延遲的特性,也就是說它不會把所有資料都儲存在記憶體中,而是透過迴圈進行讀取時,來產生值。所以Generator物件(Object)適用於處理非常龐大的資料集,甚至無限個資料的情況。如果透過串列(List)或元組(Tuple)等其它物件來處理時,會將所有資料都儲存在記憶體中,這時候就可以想像將會耗盡記憶體資源。
假設我們將上面範例中的 range(10) 調整為 range(20000),來模擬要處理的資料集非常龐大,接著引用sys模組中的getsizeof()函式(Function),來取得串列(List)及Generator物件(Oject)各佔用了多少記憶體空間,如下範例:
from sys import getsizeof
list_result = [number * 2 for number in range(20000)]
print("List: ", getsizeof(list_result)) #執行結果List: 89008
generator_result = (number * 2 for number in range(20000))
print("Generator: ", getsizeof(generator_result)) #執行結果Generator: 56
可以看到串列(List)占用了89008Bytes,而Generator物件(Object)只佔用了56Bytes,省下了不少記憶體空間。但是也需要特別注意,由於Generator物件(Object)不像其它物件如串列(List)等,把所有資料都儲存在記憶體中,所以是無法得知Generator物件(Object)的資料個數。
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike( https://www.learncodewithmike.com/2020/01/python-comprehension.html )網站觀看更多精彩內容。
0 0 67 0