30.Python三大器(3)----生成器

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()

結果如下:
在這裏插入圖片描述

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