生成器表達式入門

Python 工具箱

Hugo Bowne-Anderson

Data Scientist at DataCamp

生成器表達式

  • 複習串列生成式(list comprehension)
[2 * num for num in range(10)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
  • [ ] 換成 ( )
(2 * num for num in range(10))
<generator object <genexpr> at 0x1046bf888>
Python 工具箱

串列生成式 vs. 生成器

  • 串列生成式:回傳串列
  • 生成器:回傳生成器物件
  • 二者皆可迭代
Python 工具箱

從生成器列印值(1)

result = (num for num in range(6))

for num in result: print(num)
0
1
2
3
4
5
result = (num for num in range(6))

print(list(result))
[0, 1, 2, 3, 4, 5]
Python 工具箱

從生成器列印值(2)

result = (num for num in range(6))
  • 延遲評估(lazy evaluation)
print(next(result))
0
print(next(result))
1
print(next(result))
2
print(next(result))
3
print(next(result))
4
Python 工具箱

生成器 vs. 串列生成式

Python 工具箱

生成器 vs. 串列生成式

Python 工具箱

生成器 vs. 串列生成式

Python 工具箱

生成器表達式中的條件判斷

even_nums = (num for num in range(10) if num % 2 == 0)

print(list(even_nums))
[0, 2, 4, 6, 8]
Python 工具箱

生成器函式

  • 呼叫時會產生生成器物件
  • 用一般函式方式定義:def
  • 以產生一連串值為主,而非回傳單一值
  • 透過 yield 關鍵字逐一產生值
Python 工具箱

撰寫一個生成器函式

  • sequence.py
def num_sequence(n):
    """Generate values from 0 to n."""
    i = 0
    while i < n:
        yield i
        i += 1
Python 工具箱

使用生成器函式

result = num_sequence(5)

print(type(result))
<class 'generator'>
for item in result:
    print(item)
0
1
2
3
4
Python 工具箱

一起來練習吧!

Python 工具箱

Preparing Video For Download...