一.什么是迭代器
成都創(chuàng)新互聯(lián)公司長期為成百上千客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為呼圖壁企業(yè)提供專業(yè)的成都網站制作、網站建設,呼圖壁網站改版等技術服務。擁有10余年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
迭代器是用來迭代取值的工具。
而涉及到把多個值循環(huán)取出來的類型有:列表,字符串,元組,字段,集合,打開文件等。通過使用的遍歷方式有for···in···,while等,但是,這些方式只適用于有索引的數(shù)據類型。為了解決索引取的局限性,python提供了一種 不依賴于索引的取值方式:迭代器
注意:
二.可迭代對象
可迭代對象:但凡內置有__iter__方法的都稱為可迭代對象
常見的可迭代對象:
1.集合數(shù)據類型,如list,tuple,dict,set,str等
2.生成器,包括生成器和帶yield的生成器函數(shù)。
三.如何創(chuàng)建迭代器
迭代器是一個包含數(shù)個值的對象。
迭代器是可以迭代的對象,這意味著您可以遍歷所有值。
從技術上講,在Python中,迭代器是實現(xiàn)迭代器協(xié)議的對象,該協(xié)議由方法 __iter__() 和 __next__() 組成。
簡而言之,一個類里面實現(xiàn)了__iter__()和__next__()這兩個魔法方法,那么這個類的對象就是可迭代對象。
四.迭代器的優(yōu)缺點
1.優(yōu)點
2.缺點
五.迭代器示例
另外,如果類Stu繼承了Iterator,那么Stu可以不用實現(xiàn)__iter__()方法
遍歷迭代器
StopIteration
如果你有足夠的 next() 語句,或者在 for 循環(huán)中使用,則上面的例子將永遠進行下去。
為了防止迭代永遠進行,我們可以使用 StopIteration 語句。
在 __next__() 方法中,如果迭代完成指定的次數(shù),我們可以添加一個終止條件來引發(fā)錯誤
9.9. 迭代器
現(xiàn)在你可能注意到大多數(shù)容器對象都可以用 for 遍歷:
for element in [1, 2, 3]:
print(element)
for element in (1, 2, 3):
print(element)
for key in {'one':1, 'two':2}:
print(key)
for char in "123":
print(char)
for line in open("myfile.txt"):
print(line, end='')
這種形式的訪問清晰、簡潔、方便。迭代器的用法在 Python 中普遍而且統(tǒng)一。在后臺, for 語句在容器對象中調用 iter() 。該函數(shù)返回一個定義了 __next__() 方法的迭代器對象,它在容器中逐一訪問元素。沒有后續(xù)的元素時, __next__() 拋出一個 StopIteration 異常通知 for 語句循環(huán)結束。你可以是用內建的 next() 函數(shù)調用 __next__() 方法;以下是其工作原理的示例:
s = 'abc'
it = iter(s)
it
next(it)
'a'
next(it)
'b'
next(it)
'c'
next(it)
Traceback (most recent call last):
File "
", line 1, in ?
next(it)
StopIteration
了解了迭代器協(xié)議的后臺機制,就可以很容易的給自己的類添加迭代器行為。定義一個 __iter__() 方法,使其返回一個帶有 __next__() 方法的對象。如果這個類已經定義了 __next__() ,那么 __iter__() 只需要返回 self:
一種自動迭代的更優(yōu)雅的實現(xiàn)是使用 for循環(huán)
在Python中,迭代器(Iterator)和可迭代(iterable)的區(qū)別是,迭代器支持 iter ()和 next ()方法;可迭代支持 iter ()方法??傻荒茉趂or循環(huán)中獲得元素,迭代器還可以用next()方法獲取元素。
list/truple/map/dict都是可迭代,但不是迭代器;這些數(shù)據的大小是確定的;迭代器不是,迭代器不知道要執(zhí)行多少次,所以可以理解為不知道有多少個元素,每調用一次next(),就會往下走一步。
凡是可以for循環(huán)的,都是Iterable
凡是可以next()的,都是Iterator
數(shù)學上面的定義:迭代公式就是指用現(xiàn)在的值,代到一個公式里面,算出下一個值,再用下一個值代入公式,如此往復地代。比如:x=(x+2/x)/2 你隨便拿一個x=10代入,得x=(10+2/10)/2=5.1,再代進去x=(5.1+2/5.1)/2=2.746,再代入得1.737,以此類推。
在python中,迭代式也可以是遞歸的調用,下面給你舉個例子:
def f(n):
if n == 0 or n == 1 or n == 2: return 1
else: return f(n-1) + f(n-2)
這就是一個簡單的第n項斐波那契數(shù)的求法,這里就用的是迭代式。另外的例子就是牛頓迭代法,采用逐次漸進的效果求出n的開方數(shù),下面是例子:
def f(guess):
return guess ** 2
def fd(guess):
return 2 * guess
def SquareRootNR(x, epsilon):
guess = x / 2.0
diff = f(guess) - x
ctr = 1
while abs(diff) epsilon and ctr = 100:
guess = guess - diff / fd(guess)
diff = f(guess) - x
ctr += 1。
迭代:按照一定的順序訪問集合中的每一個元素,或者叫遍歷(其他語言叫做遍歷);
可迭代對象(Iterable):能被迭代的對象,或者說直接作用于for循環(huán)的對象,可以通過for..in來遍歷的對象,比如數(shù)組(list)、元祖(tuple)字符串等;
迭代器(Iterator):能作用于next() 函數(shù),并不斷返回下一個值的對象稱為迭代器,是惰性計算的序列(很重要)
1、判斷一個對象是可迭代對象呢?方法是通過collections模塊的Iterable類型判斷
2、判斷一個對象是否是迭代器Iterator對象
3、可迭代對象Iterable轉化為迭代器對象Iterator
4、使用迭代器迭代
1、迭代器的特性
A.惰性計算數(shù)據,節(jié)省內存
B.能記錄狀態(tài),并通過next()函數(shù)執(zhí)行下一個狀態(tài)
C.具有可迭代性
2、集合數(shù)據類型如list、dict、str、tuple等是可迭代對象Iterable但不是迭代器Iterator,不過可以通過iter()函數(shù)轉化為一個Iterator對象
原因:Iterator對象表示的是一個數(shù)據流,Iterator對象可以被next()函數(shù)調用并不斷返回下一個數(shù)據,直到沒有數(shù)據時拋出StopIteration錯誤。Iterator對象表示一個無限大的數(shù)據,集合是有限集合,假如被next()到最后就是沒有返回直接carsh
3、生成器(generator)一定是迭代器,他是一種特殊的迭代器;
如果想了解更多Python知識,請查看
Python的基礎知識之生成器
Python的基礎知識之裝飾器
學無止境,學習Python的伙伴可以多多交流。
遍歷一個序列中元素的所有可能的排列或組合。
itertools 模塊提供了三個函數(shù)來解決這類問題。 其中一個是 itertools.permutations() , 它接受一個序列并產生一個元組序列,每個元組由序列中所有元素的一個可能排列組成,即通過打亂序列中元素排列順序生成一個元組,比如:
如果想得到指定長度的所有排列,你可以傳遞一個可選的長度參數(shù)。比如:
使用 itertools.combinations() 可得到輸入序列中元素的所有的組合。比如:
對于 combinations() 來講,元素的順序已經不重要了,即組合 ('a', 'b') 與 ('b', 'a') 其實是一樣的,最終只會輸出其中一個。
在計算組合的時候,一旦元素被選取就會從候選中剔除掉(比如如果元素’a’已經被選取了,那么接下來就不會再考慮它了)。 而函數(shù) itertools.combinations_with_replacement() 允許同一個元素被選擇多次,比如:
盡管手動可以實現(xiàn)排列組合算法,但是這樣做比較麻煩,當遇到有些復雜的迭代問題時,可以先去看看itertools模塊是否能實現(xiàn),很有可能會在里面找到解決方案!