- 簡要引入:
迭代一詞之众,我們再熟悉不過了则奥,它經(jīng)常出現(xiàn)在算法中,在數(shù)學(xué)中也有很多的使用拥坛,比如一個(gè)算法經(jīng)過多少次的迭代蓬蝶,執(zhí)行的效率有了很大的提高……
迭代的意思類似于循環(huán)尘分,每一次重復(fù)的過程被稱為一次迭代的過程,而每一次迭代出現(xiàn)的結(jié)果將作為下一次迭代的初始值丸氛。 - 迭代器:提供迭代方法的容器培愁。
如:序列(列表、元祖缓窜、字符串)定续,字典
練習(xí)1
#for循環(huán)來進(jìn)行迭代
In [2]: for i in "Python":
...: print(i)
...:
P
y
t
h
o
n
注:
字符串是一個(gè)容器,也是一個(gè)迭代器禾锤,for語句能使得迭代器的功能以輸出到控制臺的方式實(shí)現(xiàn)私股,每一次從此容器中依次取出一個(gè)數(shù)據(jù),這就是迭代操作恩掷。(字典倡鲸、文件同樣支持迭代)
練習(xí)2
In [2]: dic1 = {'name':'xiaodong','sex':'male','love_language':'Python','love_quotes':'Life is short. You need Python.'}
In [3]: for dic in dic1:
...: print('%s ---- %s'%(dic, dic1[dic]))#%s字符串格式化的一種
...:
name ---- xiaodong
sex ---- male
love_language ---- Python
love_quotes ---- Life is short. You need Python.
- python中關(guān)于迭代器的2個(gè)BIF(Built-in Functions,內(nèi)置函數(shù))
- iter() -----調(diào)用iter()得到與之對應(yīng)的迭代器
- next() -----調(diào)用此方法,迭代器返回下一個(gè)值
- StopIteration異常:迭代器沒有值返回時(shí)螃成,Python會拋出此異常,結(jié)束操作
練習(xí)3
In [4]: str1 = "Python"
In [5]: iter1 = iter(str1)
In [6]: next(iter1)
Out[6]: 'P'
In [7]: next(iter1)
Out[7]: 'y'
In [8]: next(iter1)
Out[8]: 't'
In [9]: next(iter1)
Out[9]: 'h'
In [10]: next(iter1)
Out[10]: 'o'
In [11]: next(iter1)
Out[11]: 'n'
#最后拋出異常結(jié)束如下所示:
In [12]: next(iter1)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-12-b262f28c3c80> in <module>()
----> 1 next(iter1)
StopIteration:
原理如下:
In [13]: str1 = "Python"
In [14]: iter1 = iter(str1)
In [15]: while True:
...: try:
...: each = next(iter1)
...: except StopIteration:
...: break
...: print(each)
...:
P
y
t
h
o
n
- 方法實(shí)現(xiàn)
__iter()__
__next()__
- 迭代器必須實(shí)現(xiàn)
__iter__()
的方法查坪,因?yàn)橥ㄟ^此方法才能返回迭代器本身寸宏。除此之外,還需要重寫__next__()
方法偿曙,用此方法可以使得迭代器按照我們自己定義的規(guī)則進(jìn)行迭代氮凝。
斐波那契數(shù)列
In [1]: class Fibonacci:
...: def __init__(self,n = 10):#n=10是一個(gè)范圍
...: self.a = 0
...: self.b = 1
...: self.n = n
...: def __iter__(self): #返回迭代器本身
...: return self
...: def __next__(self):
...: self.a, self.b = self.b, self.a + self.b
...: if self.a > self.n: #判斷是否還有下一個(gè)輸出,如果沒有則拋出異常
...: raise StopIteration
...: return self.a
In [2]: fibonaccis = Fibonacci()#類的實(shí)例化
In [3]: for fibonacci in fibonaccis: #迭代生成此數(shù)列
...: print(fibonacci,end=' ') #end=' '可以理解為循環(huán)打印時(shí)不換行望忆,以空格分開
...:
1 1 2 3 5 8