生成器與迭代器小結

2021-10-24 09:26:30 字數 2217 閱讀 5914

1.可迭代物件:列表、字串、字典等等

hasatter(

list

,"__iter__"

)#返回ture則為可迭代物件

2.迭代器:

ps:迭代器並不會一次性把值全部存到記憶體,而是你讀多少,他才存多少,所以不佔記憶體,對於優化記憶體來說很好

可以把迭代器看成乙個指標,呼叫__next__函式一次,則指標就移動一次

例如iter_lst,就可以呼叫4次,指標就會移動到最後,再呼叫就會報錯了,那麼

怎麼把指標重新歸位到0呢,最簡單的方法就是重新賦值即可(iter_lst = iter(lst))

lst =[1

,2,3

,4] iter_lst =

iter

(lst)

#將列表lst轉為迭代器物件

print

(lst)

print

(iter_lst)

#列印迭代器物件

print

(dir

(iter_lst)

)#迭代器物件會有乙個__next__()的內建函式

print

(iter_lst.__next__())

print

(iter_lst.__next__())

#列印結果[1

,2,3

,4]>

['__iter__'

,'__next__',]

#迭代器會有這兩個屬性,乙個是代表可迭代物件,乙個是迭代器專屬屬性

12

3.自己寫乙個迭代器,仿照range()函式

import itertools #該模組是專門用來建立迭代器物件的工具

class

myrange

:def

__init__

(self, n)

: self.i =

1 self.n = n

def__iter__

(self)

:return self

def__next__

(self)

:if self.i <= self.n:

i = self.i

self.i +=

1return i

else

:raise stopiteration(

)print

(list

(range(7

)))print

([i for i in myrange(7)

])#生成乙個開始數為5的無限迭代器,每次呼叫next時,自增1

counter = itertools.count(start=5)

print

(next

(counter)

)print

(next

(counter)

)print

(next

(counter)

)#結果:[0

,1,2

,3,4

,5,6

][1,

2,3,

4,5,

6,7]

567

4.生成器:

執行一次next,則釋放一次記憶體

如果是return n , 那麼將會直接列印5次

#生成器

defy_yield

(n):

print

("start"

)while n >0:

print

("before yield"

)yield n #return n

n -=

1print

("after yield"

)yy = y_yield(5)

print

(next

(yy)

)print

(next

(yy)

)print

(next

(yy)

)#結果

start

before yield

5after yield

before yield

4after yield

before yield

3

迭代器與生成器

可迭代物件 可以直接作用於for迴圈的物件 統稱為可迭代物件 返回迭代器的物件 即iterable。一是集合資料型別,如list tuple dict set str等 二是generator,包括生成器和帶yield的generator function。容器 簡單來說 容器是一系列元素的集合 容...

生成器與迭代器

迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和 next 字串,列表或元組物件都可用於建立迭代器 list 1,2,3,...

生成器與迭代器

通過列表推導式,可以直接建立乙個列表,但是收到記憶體限制,列表容量肯定是有限的而且,建立乙個包含100萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...