想必大家都看過這樣的代碼:

上面的這段代碼會計算0-9的平方並打印出來。
那么問題來了,這段代碼和我們要說的東西有什么區別呢?

這里的關鍵字,yield,我在前面的文章里已經發過了。那么yield是什么呢?要理解yield,還得從容器說起。
容器(container)
象列表(list),集合(set),元組(tuple)--又叫序列,字典(dict)都是容器。簡單的說,容器是一種把多個元素組織在一起的數據結構,可以逐個迭代獲取其中的元素。容器可以用in來判斷容器中是否包含某個元素,如:

大多數的容器都是可迭代對象,可以使用某種方式訪問容器中的每一個元素(詳情見生成器迭代器)
迭代器內容詳見之前博客
生成器和yield
生成器其實是一種特殊的迭代器,但是不需要象迭代器一樣實現__iter__和__next__方法,只需要使用關鍵字yield就可以
我們用生成器時間一個斐波那契數列:

輸出:

上面的fib函數中沒有return關鍵字。當運行f = fib()的時候,它返回的是一個生成器對象。在調用fib()的時候並不會運行fib函數中的代碼,只有在調用next()的時候才會真正運行其中的代碼。
那么回到最開始的問題,兩種方式有什么區別?
其實,使用生成器調用函數的時候不會一次性生成所有的元素,而在每次調用next()才生成一個元素;而另一種方式,在調用函數的時候就生成了所有元素,相比之下,更耗費內存和CPU
那么,看到這里,大家是不是理解了yield關鍵字呢?
