生成器 迭代器

2022-03-01 04:46:25 字數 2756 閱讀 5260

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))

for i in

b:

print(i)

4.生成器的例子

def

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)

5. 有exception 的例子

def

fib(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)

print

(x)

except stopiteration as e: #

當有stopiteration異常時,執行下列列印語句

print("

generator return value:

",e.value)

break

view code

當執行next() 函式時,如果超出了迭代器的範圍,就會丟擲異常,這時我們可以抓住異常

1. 什麼是迭代器

可直接作用於for迴圈的資料型別有以下幾種:

一類是集合資料型別, 如list, tuple,dict,set,string

一類是 generator(生成器),包括生成器和帶yield 的generator function

這些可以直接作用於for迴圈的物件統稱為可迭代物件,iterable.

iterator=iterable+next(),

如何確定乙個物件是否是迭代物件

可使用isinstance() 判斷乙個物件是否是iterable物件

>>> from collections import

iterable

>>>isinstance(,iterable)

true

>>> isinstance('

frank

',iterable)

true

3. 將iterable 變為iterator

生成器都是迭代器;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...