1.生成器:
是乙個特殊的迭代器(迭代的抽象層級更高)
所以,擁有迭代器的特性,惰性計算資料,節省記憶體。能夠記錄下狀態,並通過next()函式,訪問下乙個狀態。具備可迭代性。
但是,如果打造乙個自己的迭代器,比較複雜,需要實現很多方法(在後續的面相物件程式設計中會講解)。所以,就有乙個更加優雅的方式:「生成器」
2.建立方式:
2.1生成器表示式:把列表推導式的換成()
(i for i in range(1, 100) if i % 2 == 0)
# 列表推導式2.2生成器函式:# 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)
函式中包含yield語句。這個函式的執行結果就是「生成器」。
yield,可以阻斷當前的函式執行。然後,使用next()函式,或者,生成器.__next__(),都會讓函式繼續執行。然後,當執行到下乙個yield的3.產生資料方式:時候,又會被暫停
def
test():
print("*********x")
yield
1print("a")
yield
2print("b")
yield
3print("c")
yield
4print("d")
yield
5print("e")
yield
6print("f")
生成器具備可迭代性。
next()函式,等價於,生成器.__next__()
可用for in方式訪問遍歷。
deftest():
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)
deftest():
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異常提示
def6.注意: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__())
如果碰到return,會直接終止,丟擲stopieration異常提示
deftest():
yield
1print("a")
return
10yield
2print("b")
yield
3print("c")
# 生成乙個生成器
g = test()
print(g.__next__())
print(g.__next__())
print(g.__next__())
生成器只會遍歷一次
deftest():
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臨時...