yeild是python的關鍵字。如果你要了解yield的作用,你必須要了解生成器(generators),了解生成器之前你需要了解什麼是可迭代物件(iterables)。
當你建立乙個列表,你可以遍歷這個列表,讀取它的每乙個元素,逐個讀取列表元素的過程稱為迭代(iteration)。
mylist = [2,3,4,5]
for i in mylist:
print(i)
像這種可以使用for…in…語法區迭代的物件都是可以迭代的物件。像字典,列表,陣列,字串都是可以迭代的物件。
生成器是迭代器(iteratos),但是只能迭代一次,生成器不會將所有值儲存在記憶體中,而是實時的生成這些值:
mygenerators = (i*i for i in range(3))
for i in mygenerators:
print(i)
將列推導式的變成了(),其他並沒有做任何的改變。但是mygenerators已經不是列表而是生成器。生成器迭代一次之後就不能再次迭代。計算出0,然後並不儲存結果和狀態繼續計算出1,最好計算出4,逐一生成。
這只是建立生成器的一種方式,另外一種方式就是我們今天的主角yield關鍵字。
def create_generator():
for i in range(3):
yield i*i
mygenerator = create_generator()
for i in mygenerator:
print(i)
yield是乙個類似return的關鍵字。當我們呼叫這個函式的時候並不是返回計算的結果。而是返回乙個生成器。只有迭代這個生成器的時候才會計算結果。
for i in mygenerator:第一次迴圈的時候函式執行到yield關鍵字位置,返回ii的值,然後將函式掛起(儲存函式執行的狀態)。for i in mygenerator:第二次迴圈時,將繼續執行剛才的函式(掛起的位置),也就是執行生成器裡面的for迴圈,返回ii的值,然後再次將函式掛起。直到生成器裡沒有值可以返回就結束。
yield可以返回值,但是不會結束函式的執行,如果函式後面還有**,同樣是可以執行的。
def test():
for i in range(3):
yield i
print(『我是生成器』)
mygen = test()
for i in mygen:
print(i)
0我是生成器
1我是生成器
2我是生成器
需要建立乙個非常大的列表直接使用列表推導式可能會導致記憶體被耗盡,這**是建立不了列表,電腦記憶體不足以儲存這個列表。
[i for i in range(1000000000)]
但是可以使用生成器建立成功,需要使用的時候再從生成器中取出。
1、不會將所有資料取出來存入記憶體中,而是返回了乙個物件,可以通過物件獲取資料,用多少取多少,可以節省記憶體空間。
2、除了能返回乙個值,還不會終止迴圈的執行
再用yield的寫法效率比普通的列表效率高
def test():
for i in range(1,111000000):
if i%2 ==0:
yield i
def test1():
result =
for i in range(1,111000000):
if i%2 ==0:
return result
0.8925411202393 #生成器的寫法耗時
1.14441919322678223 #普通寫法耗時
Python的yield關鍵字
忽然得知python有個叫yield的關鍵字,好奇之下去查了查,花了點時間基本弄明白了,故寫在此備忘,順便充充字數。yield關鍵字用來定義生成器 generator 其具體功能是可以當return使用,從函式裡返回乙個值,不同之處是用yield返回之後,可以讓函式從上回yield返回的地點繼續執行...
Python的yield關鍵字
忽然得知python有個叫yield的關鍵字,好奇之下去查了查,花了點時間基本弄明白了,故寫在此備忘,順便充充字數。yield關鍵字用來定義生成器 generator 其具體功能是可以當return使用,從函式裡返回乙個值,不同之處是用yield返回之後,可以讓函式從上回yield返回的地點繼續執行...
python中yield關鍵字
mylist是乙個可迭代的物件。當你使用乙個列表生成式來建立乙個列表的時候,就建立了乙個可迭代的物件 mylist x x for x in range 3 for i in mylist print i 01 4在這裡,所有的值都存在記憶體當中,所以並不適合大量資料 def creategener...