什麼是生成器
通過列表推導式,可以直接建立乙個列表,但是受到記憶體限制,列表容量肯定是有限的而且,建立乙個包含100萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費。所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,這樣就不必建立完整的list,從而大大節省了儲存空間。
在python中,這種一邊迴圈一邊計算的機制,成為生成器:generator
斐波那契數列案例實現生成器:
#數列寫法:1,1,2,3,5,8
#函式寫法
def fib(times):
a = 0
b = 1
n = 1
while n<=times:
print(b)
a,b = b,a+b
n += 1
fib(3)
#生成器寫法
def fib(times):
a = 0
b = 1
n = 1
while n<=times:
yield b
a,b = b,a+b
n+=1
p = fib(5)
print(p)
執行的結果為:
1 #函式寫法執行的結果
1 #函式寫法執行的結果
2 #函式寫法執行的結果
#生成器寫法執行的結果
yield 的作用就是把乙個函式變成乙個生成器, 帶有yield的函式不再是乙個普通的函式。python直譯器會將其視為乙個generator
呼叫fib(5)不會返回fib函式 而是返回乙個迭代器物件,在for迴圈執行時,每次迴圈都會執行fib函式的內部**
什麼是迭代器
迭代是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第一 個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。
可迭代物件
以直接作用於 for 迴圈的資料型別有以下幾種:
一類是集合資料型別,如 list 、 tuple 、 dict 、 set 、 str 等;
一類是 generator ,包括生成器和帶 yield 的generator function。這些可以直接作用於 for 迴圈的物件統稱為可迭代物件:iterable 。
判斷是否是可迭代
可以使用 isinstance() 判斷乙個物件是否是 iterable 物件:
而生成器不但可以作用於 for 迴圈,還可以被 next() 函式不斷呼叫並返回下乙個值,直到最後丟擲
stopiteration 錯誤表示無法繼續返回下乙個值了。
迭代器
生成器都是 iterator 物件,但 list 、 dict 、 str 雖然是 iterable ,卻不是 iterator 。把 list 、 dict 、 str 等 iterable 變成 iterator 可以使用 iter() 函式:
總結:
迭代器不一定是生成器,生成器一定是迭代器
凡是可作用於 for 迴圈的物件都是 iterable 型別; 凡是可作用於 next() 函式的物件都是 iterator 型別
集合資料型別如 list 、 dict 、 str 等是 iterable 但不是 iterator ,不過可以通過 iter() 函式獲得乙個iterator 物件。
Python生成器與迭代器
生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...
python 迭代器與生成器
迭代器和生成器 print 1 in 1,2,3 print 1 not in 1,2,3 print 4 in print 4 not in 1,2,3 print x not in dlkjfxfei 可迭代物件 iterable 可以被next 函式呼叫並不斷返回下乙個值 知道沒有資料時丟擲s...
Python 迭代器與生成器
一 迭代器 理解迭代器需要搞清楚容器 container 迭代器協議 可迭代物件 iterable 迭代器 iterator 生成器 generator 1 容器 container 容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in,not in關鍵字判斷元素是否...