十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
9.9. 迭代器
創(chuàng)新互聯(lián)建站網(wǎng)絡(luò)公司擁有十多年的成都網(wǎng)站開發(fā)建設(shè)經(jīng)驗(yàn),近千家客戶的共同信賴。提供網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站開發(fā)、網(wǎng)站定制、買鏈接、建網(wǎng)站、網(wǎng)站搭建、成都響應(yīng)式網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)師打造企業(yè)風(fēng)格,提供周到的售前咨詢和貼心的售后服務(wù)
現(xiàn)在你可能注意到大多數(shù)容器對(duì)象都可以用 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)一。在后臺(tái), for 語句在容器對(duì)象中調(diào)用 iter() 。該函數(shù)返回一個(gè)定義了 __next__() 方法的迭代器對(duì)象,它在容器中逐一訪問元素。沒有后續(xù)的元素時(shí), __next__() 拋出一個(gè) StopIteration 異常通知 for 語句循環(huán)結(jié)束。你可以是用內(nèi)建的 next() 函數(shù)調(diào)用 __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é)議的后臺(tái)機(jī)制,就可以很容易的給自己的類添加迭代器行為。定義一個(gè) __iter__() 方法,使其返回一個(gè)帶有 __next__() 方法的對(duì)象。如果這個(gè)類已經(jīng)定義了 __next__() ,那么 __iter__() 只需要返回 self:
迭代器?
迭代是訪問集合元素的一種方式。迭代器是一個(gè)可以記住遍歷的位置的對(duì)象。迭代器對(duì)象從集合的第一個(gè)元素開始訪問,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會(huì)后退。
1.可迭代對(duì)象?
以直接作用于for循環(huán)的數(shù)據(jù)類型有以下幾種:
一類是集合數(shù)據(jù)類型,如list、tuple、dict、set、str等;
一類是generator,包括生成器和帶yield的generator function。
這些可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable。
2.判斷是否可以迭代?
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterable對(duì)象:
運(yùn)行結(jié)果:
而生成器不但可以作用于for循環(huán),還可以被next()函數(shù)不斷調(diào)用并返回下一個(gè)值,直到最后拋出StopIteration錯(cuò)誤表示無法繼續(xù)返回下一個(gè)值了。
相關(guān)推薦:《Python視頻教程》
3.迭代器
可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator。
運(yùn)行結(jié)果:
4.iter()函數(shù)?
生成器都是Iterator對(duì)象,但list、dict、str雖然是Iterable,卻不是Iterator。
把list、dict、str等Iterable變成Iterator可以使用iter()函數(shù):
運(yùn)行結(jié)果:
總結(jié)
·凡是可作用于for循環(huán)的對(duì)象都是Iterable類型;
·凡是可作用于next()函數(shù)的對(duì)象都是Iterator類型
·集合數(shù)據(jù)類型如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函數(shù)獲得一個(gè)Iterator對(duì)象。
·目的是在使用集合的時(shí)候,減少占用的內(nèi)容。
相關(guān)推薦:
三分鐘看懂什么是Python生成器
數(shù)學(xué)上面的定義:迭代公式就是指用現(xiàn)在的值,代到一個(gè)公式里面,算出下一個(gè)值,再用下一個(gè)值代入公式,如此往復(fù)地代。比如:x=(x+2/x)/2 你隨便拿一個(gè)x=10代入,得x=(10+2/10)/2=5.1,再代進(jìn)去x=(5.1+2/5.1)/2=2.746,再代入得1.737,以此類推。
在python中,迭代式也可以是遞歸的調(diào)用,下面給你舉個(gè)例子:
def f(n):
if n == 0 or n == 1 or n == 2: return 1
else: return f(n-1) + f(n-2)
這就是一個(gè)簡單的第n項(xiàng)斐波那契數(shù)的求法,這里就用的是迭代式。另外的例子就是牛頓迭代法,采用逐次漸進(jìn)的效果求出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。