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。

二、區別

  1. 和列表表達式區別
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'>

可以看到我們用元組的形式表示,則爲生成器表達式

生成器表達式是對內存空間的優化。他們不需要像方括號的列表解析一樣,一次構造出整個結果列表。

列表解析式更快,生成器表達式更省內存!

  1. 和傳統函數的差別
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 

傳統函數是反覆調用。

而生成器函數是掛起,然後迭代繼續。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章