1.什麼是生成器
生成器的目的:節省記憶體空間,可以乙個乙個生成解釋,訪問的時候才存在,不訪問不生成。
背景: 通過列表生成式,我們可以直接建立乙個列表, 但是,收到記憶體限制,列表容量肯定是有限的。而且,建立乙個由100萬個元素的列表,
不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,而後面絕大多數元素占用的空間都白白浪費了。
所以,列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣不必創造出完整的list,從而節省大量的空間,在python中,這種一邊迴圈,一邊計算的機制,成為生成器,generator
2.怎麼樣寫生成器:
2.1 列表生成式 [i*2 for i in range(10)]
2.2 將變為() (i *2 for i in range(10))
3.生成器特點:只有在呼叫時才會生成相應的資料,只記錄當前位置, 只有乙個next方法(不能向前取值) __next__()
生成器例子
b = (i *2 for i in range(10))4.生成器的例子for i in
b:
print(i)
def5. 有exception 的例子fib(max):
n, a, b = 0, 0, 1 #
先預先定義初始值
while n < max: #
n<10
#print(b) 將列印語句變為yield,即成為生成器
yield b #
變為生成器
a,b=b,a+b
n=n+1
return
"done"#
print(fib(10))
f=fib(10)
print(f.__next__
())print("
**********==")
print(f.__next__
())print(f.__next__
())print(f.__next__
())print("
start loop
") #
每次開始都會停留在上一次讀取的位置
for i in
f:
print(i)
defview codefib(max):
n,a,b=0,0,1
while n
a,b=b,a+b
yield
b n=n+1
return
"done
"f=fib(5)
#如下報出來了異常,我們應該抓住這個異常,如fib2.py
while
true:
try: #
執行下列**
x = next(f) #
next(iterator)
(x)
except stopiteration as e: #
當有stopiteration異常時,執行下列列印語句
print("
generator return value:
",e.value)
break
當執行next() 函式時,如果超出了迭代器的範圍,就會丟擲異常,這時我們可以抓住異常
1. 什麼是迭代器
可直接作用於for迴圈的資料型別有以下幾種:
一類是集合資料型別, 如list, tuple,dict,set,string
一類是 generator(生成器),包括生成器和帶yield 的generator function
這些可以直接作用於for迴圈的物件統稱為可迭代物件,iterable.
iterator=iterable+next(),
如何確定乙個物件是否是迭代物件
可使用isinstance() 判斷乙個物件是否是iterable物件
>>> from collections import3. 將iterable 變為iteratoriterable
>>>isinstance(,iterable)
true
>>> isinstance('
frank
',iterable)
true
生成器都是迭代器;list,dict,str雖然都是iterable,卻不是iterator,把list,dict,str等iterable變成iterator 可使用iter()函式.
range(10)是乙個迭代器
4.為什麼 list,dict, str等資料流型別不是iterator?
這是因為python的iterartor物件表示的是乙個資料流, iterator物件可以被next() 函式呼叫並不斷返回下乙個資料,直到沒有資料流時丟擲
stopiteration錯誤,可以把這個資料流看作是乙個有序序列,但我們卻不能提前知道序列的長度, 只能通過next()函式實現按需計算下乙個資料,
所以在iterator的計算是惰性的, 只有在需要返回下個資料時才會計算。
iterator 甚至可以表示乙個無限大的資料流, 例如全體自然數,而使用list永遠不會儲存全體自然數。
凡是可作用於for迴圈的物件都是iteratable型別
凡是可作用於next()函式的物件是iterator型別,它表示乙個惰性計算的序列。
生成器 迭代器
最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...
迭代器,生成器
迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...
迭代器 生成器
迭代器 iter 可迭代物件 下乙個元素的值 next 可迭代物件 類中實現 iter 方法 提供迭代器 實現迭代器 import time class mylistiter object 迭代器類 def init self,data self.data data self.index 0 def...