2023年9月30日 星期六

Python的生成式(Comprehensive)和產生器(Generator)有何不同呢?

參考文章:

  1. Python Comprehension 解析式語法
  2. Python Comprehension語法應用教學
  3. 產生器 generator


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, 4, 5]
[1, 4, 9, 16, 25]

範例二、偶數平方串列生成式
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]

執行結果:
[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: '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]

執行結果:
[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}

執行結果:
{'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

執行結果:
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 3 5 7 9 

範例九、從0開始的自然數產生器
 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

執行結果:
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 

以上範例展示了生成式和產生器的不同用途。生成式用於創建新的串列、字典、和集合,而產生器用於按需要來生成數值,特別適用於處理大型數據集或需要逐個生成數值的情況。

沒有留言:

張貼留言