參考文章:
Python程式語言非常優美,其語法非常簡潔,特別是在使用生成式(Comprehensive)和產生器(Generator)時,但有時可能會讓人感到難以理解。生成式和產生器是Python中的兩個不同概念,它們用於不同的編程任務,並且在功能和用法上存在顯著區別。
- 生成式(Comprehensive)
在Python中,「生成式」通常指的是列表生成式(List Comprehension)或字典生成式(Dictionary Comprehension)。這是一種以簡潔的方式創建新列表或字典的方法。它們通常用於將一個可迭代對象(例如列表、元組或字符串)轉換為另一個列表或字典,同時可以對元素進行篩選、映射或轉換。以下是一個列表生成式的示例,它將一個列表中的每個元素平方並創建一個新的列表:
範例一、平方串列生成式
1 2 3 4 | 原始串列 = [1, 2, 3, 4, 5] 平方串列 = [x**2 for x in 原始串列] print(原始串列) print(平方串列) |
1 2 3 | original_list = [1, 2, 3, 4, 5, 6] squared_even_list = [x**2 for x in original_list if x % 2 == 0] print(squared_even_list) # 輸出 [4, 16, 36] |
執行結果:
1 2 3 | original_dict = {'a': 1, 'b': 2, 'c': 3} flipped_dict = {value: key for key, value in original_dict.items()} print(flipped_dict) # 輸出 {1: 'a', 2: 'b', 3: 'c'} |
執行結果:
1 2 3 | original_list = [1, 2, 3, 4, 5, 6] filtered_list = [x for x in original_list if x > 3] print(filtered_list) # 輸出 [4, 5, 6] |
1 2 3 | original_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4} filtered_dict = {key: value for key, value in original_dict.items() if value > 2} print(filtered_dict) # 輸出 {'c': 3, 'd': 4} |
- 產生器(Generator)
產生器是一種特殊的迭代器,它允許您根據需要生成值,而無需一次性將所有值存儲在記憶體中。產生器通常使用函數和 yield 陳述句來定義。產生器的主要優勢在於處理大量數據時,它們可以節省記憶體,並且能夠以惰性(lazy)的方式生成數據,只在需要時生成下一個值。以下是一個產生器的示例:
範例六、產生器
1 2 3 4 5 6 7 8 | def my_generator(): yield 1 yield 2 yield 3 gen = my_generator() for value in gen: print(value) |
執行結果:
1
2
3
範例七、費氏級數產生器
1 2 3 4 5 6 7 8 9 10 | def fibonacci_generator(): a, b = 0, 1 while True: yield a a, b = b, a + b fib_gen = fibonacci_generator() for _ in range(10): print(next(fib_gen), end=' ') # 輸出前10個費氏級數的數字 # 輸出 0 1 1 2 3 5 8 13 21 34 |
執行結果:
1 2 3 4 5 6 7 8 9 10 | def odd_number_generator(): n = 1 while True: yield n n += 2 odd_gen = odd_number_generator() for _ in range(5): print(next(odd_gen), end=' ') # 輸出前5個奇數 # 輸出 1 3 5 7 9 |
執行結果:
1 2 3 4 5 6 7 8 9 10 | def natural_number_generator(): n = 0 while True: yield n n += 1 nat_gen = natural_number_generator() for _ in range(5): print(next(nat_gen), end=' ') # 輸出前5個自然數 # 輸出 0 1 2 3 4 |
執行結果:
1 2 3 4 5 6 7 8 9 10 | import random def random_number_generator(): while True: yield random.randint(1, 100) rand_gen = random_number_generator() for _ in range(5): print(next(rand_gen), end=' ') # 輸出前5個隨機數 # 例如:輸出 42 17 89 5 73(實際數字會不同) |
執行結果:(注意每次執行結果都不同)
86 52 33 71 8
以上範例展示了生成式和產生器的不同用途。生成式用於創建新的串列、字典、和集合,而產生器用於按需要來生成數值,特別適用於處理大型數據集或需要逐個生成數值的情況。