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萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...