1.初識生成器
生成器就是自定義的迭代器
生成器的定義:
def func():
print(1)
yield 1
print(2) #yield的返回值相當於__next__()獲得的值
yield 2
print(3)
yield 3
ret = func()
print(ret) 結果是:<generator object func at 0x0000023293B52C50> 生成器對象
print(ret.__iter__) 結果是:<method-wrapper '__iter__' of generator object at 0x0000023293B52C50>
print(ret.__next__) 結果是:<method-wrapper '__next__' of generator object at 0x0000023293B52C50>
當函數有yield關鍵字時,調用函數會得到一個生成器返回值,使用生成器的__next__()會執行yield之前的函數體代碼,然後將yield返回的值當做函數調用的返回值
yield與return的區別:yield可以返回多次值,return只會返回一次值
示例代碼:
def func():
print("第一次")
yield 1
print("第二次")
yield 2
print("第三次")
yield 3
ret = func()
ret1 = next(ret)
print(ret1)
ret2 = next(ret)
print(ret2)
ret3 = next(ret)
print(ret3)
next(ret)
結果如下:
前三次,生成器中都有yield返回值,所以不會報錯,第四次沒有yield返回值,也就是迭代器去不到值了,所以就會拋出StopIteration的錯誤
2.進階
def func():
while 1:
x = yield 1
print(x)
g = func() #生成一個生成器對象
g.send(None) #相當於next(g)
g.send("哈哈")
g.send("呵呵")
g.close()
注意事項:
1.send()可以給yield傳值,yield將值轉交給x
2.在使用send()之前,必須先讓生成器取一次值
3.send(None) == next()
結果如下: