圖片來源:(https://kknews.cc/comic/5npz2l3.html)
是一種特殊的函數,允許逐漸生成值,而不是一次性返回所有結果。這對於處理大型數據集或需要延遲計算的情況非常有用,因為可以節省記憶體
使用 yield
關鍵字: 當一個函數包含 yield
關鍵字時,這個函數就會變成一個生成器函數。每次調用 next()
方法時,函數會從上次停止的地方繼續執行,直到遇到下一個 yield
表達式,然後返回該值。
節省記憶體
: 只在需要時產生值,避免一次性載入所有數據簡潔高效
: 對於產生無限序列或大型數據集非常有用易於理解
: 符合自然語言的表達方式,例如「產生一個斐波那契數列」def create_numbers(n):
for i in range(n):
yield i
# 使用生成器
numbers = create_numbers(5)
for num in numbers:
print(num)
# 生成斐波那契數列的生成器
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
# 使用生成器
for num in fibonacci():
if num > 100:
break
print(num)
列表推導式
可以將列表推導式改為生成器表達式,以節省記憶體
# 列表推導式
squares = [x**2 for x in range(10)]
# 生成器表達式
squares_gen = (x**2 for x in range(10))
無限序列
生成器可以生成無限序列,例如斐波那契數列
def count_up(start=0):
x = start
while True:
yield x
x += 1
# 使用生成器
counter = count_up(10)
print(next(counter)) # 輸出 10
print(next(counter)) # 輸出 11
文件處理
生成器可以逐行讀取大文件,避免一次性將整個文件讀入記憶體
def read_large_file(filename):
with open(filename, 'r') as f:
for line in f:
yield line
特性 |
列表推導式 |
生成器表達式 |
---|---|---|
記憶體使用 |
一次性創建整個列表,佔用較多記憶體 | 逐漸產生值,節省記憶體 |
返回值 |
返回一個列表 | 返回一個生成器對象 |
使用場景 |
需要一次性獲取所有值時 | 需要逐漸處理值時 |
send()方法
:向生成器傳入值,改變生成器的狀態throw()方法
:向生成器拋出異常close()方法
:可以關閉生成器生成器是 Python 中一個強大的工具,可以讓程式碼更加高效、簡潔。特別是在處理大型數據集或需要產生無限序列時,生成器是一個非常好的選擇
圖片來源:(https://guavanthropology.tw/article/6867)