在聊生成器之前,我們先看看什么是生成式?
a = [i*2 for i in range(10) ] 類似于這樣的就是生成式

而把串列 “ [ ] ” 符號換成 " () " 則就稱為 generator 型別

什么是生成器?
在 Python 中,使用了 yield 的函式被稱為生成器,
跟普通函式不同的是,生成器是一個回傳迭代器的函式,只能用于迭代操作,更簡單點理解生成器就是一個迭代器,
生成器的特點:
1).只有在呼叫時才會生成相應的資料
2).只記錄當前位置
3).只有一個__next__() 方法,在python2.7中是 next()
下面我們用斐波那契數列,寫一個生成器:

那么我們為什么要用生成器,它的優點是什么呢?
由于生成器只有在呼叫時,才會生成資料,所以它可以節省記憶體占用,而且生成器可在單執行緒下實作并發運算處理效果,這點很牛逼,
以下是并行效果代碼演示:

接下來我們來看看什么是迭代器?
我們知道,可以直接作用于for 回圈的資料型別有以下幾種:
一類是集合資料型別,如 list、tuple、dict、set、str 等;
一類是generator,包括生成器和帶yield的generator function,
我們把這些可以直接作用于for回圈的物件統稱為可迭代物件:Iterable ,
像生成器這樣,不但可以作用于for回圈,還可以被next() 函式不斷呼叫并回傳下一個值,
直到最后拋出StopIteration 錯誤表示無法繼續回傳下一個值了,我們把這種可以被next()函式
呼叫并不斷回傳下一個值的物件稱為迭代器:Iterator,
由此可見,我們可以知道,生成器肯定是一個迭代器,但迭代器不一定是生成器,
當然我們也可以使用 iter() 函式,把可迭代物件(Iterable)變成迭代器(Iterator)


小結:
凡是可作用于for 回圈的物件都是 Iterable 型別;
凡是可作用于next() 函式的物件都是Iterator型別,它們表示一個惰性計算的序列;
集合資料型別如list 、dict、str等是Iterable但不是Iterator,不過可以通過iter() 函式獲得一個 Iterator 物件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/240359.html
標籤:其他
上一篇:java多重繼承
