對計算機特定程式中需要反覆執行的子程式*(一組指令),進行一次重複,即重複執行程式中的迴圈,直到滿足某條件為止,亦稱為迭代。
滿足迭代條件的叫做可迭代物件,比如for迴圈
lst =[11
,22,33
,44]for i in lst:
print
(i)#從lst中迴圈遍歷輸出值,這個過程是重複執行,叫做迭代,這個lst是可迭代物件
同理:python中的資料容器比如:list、dic、tuple、set、 string 等都是可迭代物件。
如何判斷乙個物件是否是可迭代物件。
1、粗暴版:就是資料物件能否用for遍歷出來
2、精準判斷:資料物件是否實現了__getitem__()方法(list、dic、tuple、set、 string內部都是實現了此函式方法)
3、標準程式實現 _ iter_() 方法,則是可迭代的
迭代器跟可迭代物件去的區別在於迭代器同時實現了__iter__()和__next__()方法,迭代器物件可以通過next()函式訪問
from collections.abc import iterable#iterable可迭代物件
from collections.abc import iterator#迭代器
lst =
#如果乙個乙個物件可以用for遍歷,這個物件就是可以迭代的,比如list、dic、tuple、set、string,容器物件都是可迭代物件
class
classmates2
(object):
def__init__
(self)
: self.names =
list()
defadd
(self,name)
:def
__iter__
(self)
:#如果想要乙個物件稱為乙個可以迭代的物件,那麼必須實現__iter__方法(或者__getitem__()方法)
return
iter
(self.names)
#返回該可迭代物件的迭代器類的例項
class
classmates3
(object):
def__init__
(self)
: self.i =
0 self.names =
list()
defadd
(self,name)
:def
__iter__
(self)
:return self
def__next__
(self)
:if self.i<
len(self.names)
: self.i+=
1return self.names[self.i-1]
else
:raise stopiteration(
)#如果乙個惡物件稱為迭代器,那麼必須實現__next__方法
'''__next__(self):相當於乙個while true,每次一迴圈結束返回乙個'return 結果',直到條件不滿足結束迴圈
def __next__(self):
return self.names#如果這樣寫,將會返回無限個names,相當於while true永遠不結束
'''classmate = lst
'老王'
)'小李'
)'張三'
)#classmate.__getitem__(),list dic tuple都實現了__getitem__()方法,是可迭代物件
print
(isinstance
(classmate,iterable)
)for i in classmate:
print
(i)classmate = classmates2(
)classmate.add(
'老王'
)classmate.add(
'小李'
)classmate.add(
'張三'
)print
(isinstance
(classmate,iterable)
)print
(isinstance
(classmate,iterator)
)#沒有實現__next__(),是可迭代物件,但不是迭代器
for i in classmate:
print
(i)classmate = classmates3(
)classmate.add(
'老王'
)classmate.add(
'小李'
)classmate.add(
'張三'
)print
("是否是迭代器:"
,isinstance
(classmate,iterator)
)print
(next
(classmate)
)print
(next
(classmate)
)print
(next
(classmate)
)
生成器是特殊的迭代器,生成器主要用於生成資料,整合了iter()和next()函式,迭代器主要用於資料的迭代輸出。
常用python生成器函式有yield()
def
create_num
(all_num)
: a, b =0,
1 current_num =
0while current_num < all_num:
a, b = b, a+b
current_num+=
1yield a
defcreate_num1
(all_num)
:#這是非常規寫法,主要用來提現yield和return的區別
a, b =0,
1 current_num =
0while current_num < all_num:
yield b#區分一下 yield和return的區別
a, b = b, a+b
current_num+=
1return
'over'
#這句一般不要,沒有用
'''如果乙個函式中有yield關鍵字,則這個函式不再是乙個函式,就是乙個生成器模版
如果在呼叫create_num的時候,發現這個函式中有yield物件,那麼此時,不是呼叫函式,而是建立乙個生成器物件
'''a = create_num(10)
#建立乙個生成器物件
for i in a:
print
('a:'
,i)b = create_num1(10)
#建立乙個生成器物件
print
('b:'
,next
(b))
print
('b:'
,next
(b))
print
('b:'
,next
(b))
print
('b:'
,next
(b))
while
true
:try
:print
(next
(b))
except exception as error:
print
(error.value)
#可以獲取return的值
break
為什麼有一系列容器還需要迭代器和生成器,因為如list等容器物件儲存的是生成的大量資料,如果數量巨大的話會占用很多記憶體空間,而迭代器儲存的是生成資料的方式,要的時候再生成,節約記憶體空間,但是同樣的會消耗時間
就跟做饅頭一樣,如果開始說需要100個饅頭,但是不知道什麼時候吃,如果提前做好了需要空間儲存,所以只要直到饅頭怎麼做就行了,主要知道了做饅頭的方法,需要的時候邊做邊吃,這樣節約了空間,但是響應的浪費了事件,迭代器也是這樣,用迭代器生成資料,只有在用next()的時候才會計算生成,
Python 迭代物件 迭代器 生成器
容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個的迭代獲取,可以用 in not in 關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有元素儲存在記憶體中。比如 list,set,tuples都是容器物件 1 in 1,2,3 true 4 not in 1,2,3 true 1...
Python 可迭代物件 迭代器 生成器
在討論可迭代物件和迭代器之前,我們先來了解一下什麼是迭代器 迭代器是一種最簡單也最常見的設計模式。它可以讓使用者透過特定的介面巡訪容器中的每乙個元素而不用了解底層的實現。維基百科 迭代是資料處理的基石。當記憶體中放不下資料集時,我們要找到一種惰性獲取資料的方式,即按需一次獲取乙個資料項,這就是迭代器...
python可迭代物件 迭代器 生成器
乙個擁有 iter 方法的物件,可以使用for迴圈遍歷 可迭代物件有 str list tuple dict set iterator generator file 判斷乙個物件是否可迭代 from collections import iterable isinstance abc iterabl...