python里的关键字有哪些_Python中的yield关键字做了什么?
Python中的yield關鍵字做了什么
要理解yield做了什么,就必須明白生成器(generators)為何物,而在明白生成器之前還要知道迭代器(iterables)。
1.迭代器
當我們創建一個list的時候,我們可以一個接一個的讀取它的成員。這種一個接一個讀取的行為叫做迭代:
>>>mylist = [1, 2, 3]
>>>for i in mylist:
... print(i)
1
2
3
mylist就是一個迭代器。當我們使用列表推導式(亦稱列表生成式,list comprehension)時,我們創建了一個list,同時還有一個迭代器:
>>>mylist = [x*x for x in range(3)]
>>>for i in mylist:
... print(i)
0
1
4
我們可以使用“ for … in …”的任何事物都是迭代器,如:列表、字符串、文件等。
這些迭代器很便利,我們可以想讀取多少就讀取多少,但是我們要在內存中儲存所有的可取值,然而當我們有太多的值時我們不總是希望如此。
2.生成器
生成器(generators)也是迭代器,但是我們只能對其迭代一次。這是因為生成器并沒有在內存中存儲所有的值,而是要靠動態生成。
>>> mygenerator = (x*x for x in range(3))>>> for i in mygenerator:... print(i)014
我們用圓括號()代替了方括號[],除此之外是相同的。但是,我們不能重復執行for i in mygenerator,因為生成器只能使用一次:先計算出0,然后就忘了這個0并計算出1,最終計算出4。
3.yieldyield是一個關鍵字,使用起來類似return,但是使用的函數會返回一個生成器。
>>> def createGenerator():... mylist = range(3)... for i in mylist:... yield i*i...>>> mygenerator = createGenerator() # 創建一個生成器>>> print(mygenerator) # mygenerator是一個對象!>>> for i in mygenerator:... print(i)014
這是一個沒用的例子,但是當我們知道我們的函數要返回一個龐大的值集合,而這些值我們只會迭代讀取一次時,這樣使用是很方便的。
要掌握yield,我們必須理解當我們在調用函數的時候,我們在函數體中寫的代碼并沒有執行。函數僅返回了一個生成器對象,這有點意想不到。
然后,當for每次使用生成器的時候,我們的代碼都會被執行一次。
重要的細節部分:
第一次for調用由我們的函數創建的生成器時,會從頭執行我們函數中的代碼直到遇見yield關鍵字,然后會返回循環的第一個值。其后每次調用都會再一次運行我們在函數中寫的循環,返回下一個值,以此一直到再沒有返回值。
一旦函數運行但不再激發yield時,就可以認為生成器已經空了。這可能是由于循環已經結束,或者由于我們不再滿足“if/else”的條件判斷。
本文版權歸傳智播客人工智能+Python學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客人工智能+Python學院
總結
以上是生活随笔為你收集整理的python里的关键字有哪些_Python中的yield关键字做了什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python面向对象编程的三大特性_Py
- 下一篇: 虚拟化技术原理与实现 pdf_多进程的实