python函式 生成器

2021-08-20 08:11:16 字數 2763 閱讀 3270

1.生成器:

是乙個特殊的迭代器(迭代的抽象層級更高)

所以,擁有迭代器的特性,惰性計算資料,節省記憶體。能夠記錄下狀態,並通過next()函式,訪問下乙個狀態。具備可迭代性。

但是,如果打造乙個自己的迭代器,比較複雜,需要實現很多方法(在後續的面相物件程式設計中會講解)。所以,就有乙個更加優雅的方式:「生成器」

2.建立方式:

2.1生成器表示式:把列表推導式的換成()

(i for i in range(1, 100) if i % 2 == 0)

# 列表推導式

# l = [i for i in range(1, 1000000) if i % 2 == 0]

# 生成器表示式(把列表推導式的換成())

l = (i for i in

range(1

, 1000000) if i % 2 == 0)

print(next(l))

print(next(l))

print(l.__next__()) # 等同於print(next())

for v in l:

print(v)

2.2生成器函式:

函式中包含yield語句。這個函式的執行結果就是「生成器」。

yield,可以阻斷當前的函式執行。然後,使用next()函式,或者,生成器.__next__(),都會讓函式繼續執行。然後,當執行到下乙個yield的

時候,又會被暫停

def

test():

print("*********x")

yield

1print("a")

yield

2print("b")

yield

3print("c")

yield

4print("d")

yield

5print("e")

yield

6print("f")

3.產生資料方式:

生成器具備可迭代性。

next()函式,等價於,生成器.__next__()

可用for in方式訪問遍歷。

def 

test():

for i in

range(1

, 1000):

if i % 2 == 0:

yield i

g = test()

print(g)

print(next(g))

print(next(g))

print(next(g))

print(next(g))

print(next(g))

print(next(g))

4.send()函式:

send()方法有乙個引數,指定的是上一次被掛起的yield語句的返回值。

相比於生成器.__next__(),可以額外的給yield語句傳值。

注意第一次呼叫->t.send(none)

def 

test():

res1 = yield

1print(res1)

res2 = yield

2print(res2)

t = test()

# print(t.__next__())

# print(t.__next__())

print(t.send(none))

print(t.send(100))

5.關閉生成器:

g.close

後續如果繼續呼叫,會丟擲stopiteration異常提示

def 

test():

yield

1print("a")

yield

2print("b")

yield

3print("c")

# 生成乙個生成器

g = test()

print(g.__next__())

g.close()

print(g.__next__())

print(g.__next__())

print(g.__next__())

6.注意:

如果碰到return,會直接終止,丟擲stopieration異常提示

def 

test():

yield

1print("a")

return

10yield

2print("b")

yield

3print("c")

# 生成乙個生成器

g = test()

print(g.__next__())

print(g.__next__())

print(g.__next__())

生成器只會遍歷一次

def 

test():

yield

1print("a")

yield

2print("b")

yield

3print("c")

# 生成乙個生成器

g = test()

for i in g:

print(i)

print("-" * 40)

#再生成一遍生成器,就可以再次遍歷了

g = test()

for i in g:

print(i)

python生成器函式 Python 生成器函式

一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...

python 生成器函式

python 函式的定義體中有 yield 關鍵字,該函式就是生成器函式。呼叫生成器函式時,會返回乙個生成器物件。生成器函式的定義體執行完畢後,生成器物件會丟擲stopiteration 異常。def gen a print start yield 1 print starting yield 2 ...

Python 生成器函式

生成器函式 包含yield語句的函式 生成器物件 生成器物件和迭代器物件行為相似,都支援可迭代介面 next 若想執行生成器函式內部語句,則需要迭代協議 a 生成器函式被呼叫時,並不會執行函式內部語句,而是返回乙個生成器物件 b 每執行一條語句,返回對應的乙個yield數值,雖然函式被yield臨時...