迭代器 可迭代物件與生成器

2022-07-13 12:12:06 字數 3926 閱讀 7242

iterator 與 gerater的作用是優化記憶體,當處理大檔案,大資料的時候可以使用。

1. 對大列表進行優化

2. 大檔案的優化

迭代器:  一種資料型別,用來處理大資料

可迭代物件:乙個物件,能每次返回資料組中的乙個成員,for迴圈中每次返回乙個資料或者用來作為iter內建函式的引數,返回迭代器物件

生成器:  生成器是通過yield 或 生成器表示式,用一種比較方便的方式生成了迭代器。

yield函式就是乙個生成器:

yield的作用:

1. 相當於return返回乙個值

2. 記住該位置,下次進來從這個位置開始。

兩種使用方式:

1. 使用next 和 send 需結合異常處理(當超出最大值的時候,會報錯)

2. 使用for迴圈,for內部自動幫我們處理異常

def

ge():

yield 8

yield 88

yield 888g =ge()

print

(next(g))

print

(next(g))

print

(next(g))

print(next(g)) #

報錯,超出

使用for處理

def

gen_num2():

for i in range(8): #

range是乙個惰性機制。

yield

ifor i in

gen_num2():

print(i)

from collections import

iterator, iterable, generator

#列表的型別判斷

li = [1, 2, 3, 4]

print(isinstance(li, iterable)) #

true

print(isinstance(li, iterator)) #

false

print(isinstance(li, generator)) #

false

#字典的型別判讀

dic =

print(isinstance(dic, iterable)) #

true

print(isinstance(dic, iterator)) #

false

print(isinstance(dic, generator)) #

false

#range的型別判斷

#range是乙個可迭代物件,不是迭代器。但是他跟迭代器有類似的地方,又乙個惰性機制,所有也很節約記憶體

r = range(10)

print

(type(r))

print(isinstance(r, iterable)) #

true

print(isinstance(r, iterator)) #

false

print(isinstance(r, generator)) #

false

#檔案物件 是乙個迭代器

with open('

1.txt

', 'wb'

) as f:

pass

print(isinstance(f, iterable)) #

true

print(isinstance(f, iterator)) #

true

print(isinstance(f, generator)) #

false

#yield物件

defge():

for i in range(9):

yield

(i)g =ge()

print(isinstance(g, iterable)) #

true

print(isinstance(g, iterator)) #

true

print(isinstance(g, generator)) #

false

使用iter內建函式

from collections import

generator, iterable, iterator

x = [x for x in range(10)]

y = iter(x) #

列表轉換為迭代器

print

(next(y))

print

(next(y))

print

(next(y))

print

(next(y))

print

(isinstance(y, iterable))

print(isinstance(y, iterator)) #

是迭代器物件,

print

(isinstance(y, generator))

dic =

print

(isinstance(dic, iterable))

print

(isinstance(dic, iterator))

print

(isinstance(dic, generator))

d = iter(dic) #

字典轉換為迭代器

print

(type(d))

print

(isinstance(d, iterable))

print

(isinstance(d, iterator))

print(isinstance(d, generator))

#

列表表示式

y = [x for x in range(10)]

#生成器表示式

z = (x for x in range(10))

print(type(z), z)

1. 函式優化

#

斐波那契

#0,1,1,2,3

deffb(n):

a, b = 0, 1

while a

print

(a) a,b = b, a+b

deffb_list(n):

a, b = 0, 1fblist =

while a

#當資料量非常大的時候,就會造成記憶體**

a, b = b, a+b

return

fblist

print(fb_list(1000))

deffb_ge(n):

a, b = 0, 1fblist =

while a

yield a #

使用生成器每次來取,優化記憶體

a, b = b, a+b

for i in fb_ge(1000):

print(i, end='

')

2. 大檔案優化

開啟檔案的物件,本身就是乙個迭代器。

with open('

1.txt

', 'wb'

) as f:

pass

print(isinstance(f, iterable)) #

true

print(isinstance(f, iterator)) #

true

print(isinstance(f, generator)) #

false

可迭代物件 迭代器,生成器

可迭代物件 iterator 列表 集合 元組 字典 字串 生成器 我們可以使用isintance 判斷乙個物件是否是iterator物件 生成器 通過列表生成式,我們可以直接建立乙個列表,但是,受到記憶體限制,列表容量肯定是有限的,如果我們僅僅需要訪問前面幾個元素,如果列表元素可以按照某種演算法推...

可迭代物件 迭代器 生成器

可迭代物件 for迴圈機制 迭代器生成器 總結type所返回的型別是例項物件的類物件,而isinstance所進行的判斷則包含了例項物件的類物件及其父類。如圖 可迭代物件 迭代器 生成器所屬的型別分別為collections包裡的iterable,iterator,generator.實現了 ite...

可迭代物件 迭代器 生成器

名詞解釋 可迭代物件 1 遵循了 實現了 迭代器協議的物件。物件內部定義了乙個 iter 方法,以實現迭代器協議 2 列表 元組 字典 字串等等的都不是可迭代物件,當用for迴圈遍歷的時候,其實for先去執行了.iter 方法,將列表 元組 字串等變成乙個可迭代的物件,在進行迭代。iter 下有 n...