Python 生成器如何設置和使用
Python 的生成器其實可以理解為一種比較複雜的迭代器。
關於迭代器,可以參考:
Python 迭代器的設置和使用方法
一、程式碼舉例:
def gen(x,y):
txt = 'I love ' + x
yield txt
txt_1 = ', You love ' + y
yield txt + txt_1
gen_txt = gen('apple','peach')
print(type(gen_txt))
print(next(gen_txt))
print(next(gen_txt))
print(next(gen_txt))
<class 'generator'>
I love apple
I love apple, You love peach
StopIteration
這裡和迭代器一樣,可以用 next() 一步步執行。
這裡叫做生成器函數。
第一次執行以後會從第一個 yield 的地方返回結果。
然後再執行 next() ,從跳出的地方繼續往下執行到第二個 yield。
二、區別
- 和列表表達式區別
for x in (x ** 2 for x in range(5)):
print(x)
for x in [x ** 2 for x in range(5)]:
print(x)
a=(x ** 2 for x in range(5))
b=[x ** 2 for x in range(5)]
print(type(a))
print(type(b))
0
1
4
9
16
0
1
4
9
16
<class 'generator'>
<class 'list'>
可以看到我們用元組的形式表示,則為生成器表達式。
生成器表達式是對記憶體空間的優化。他們不需要像方括弧的列表解析一樣,一次構造出整個結果列表。
列表解析式更快,生成器表達式更省記憶體!
- 和傳統函數的差別
def gen_squares(num):
for x in range(num):
yield x ** 2
for i in gen_squares(5):
print(i, end=' ')
0 1 4 9 16
def sq(num):
return num**2
for i in range(5):
print(sq(i), end=' ')
0 1 4 9 16
傳統函數是反覆調用。
而生成器函數是掛起,然後迭代繼續。