python中的迭代器(以斐波那契數(shù)列為主講解)

  • 簡要引入:
    迭代一詞,我們再熟悉不過了,它經(jīng)常出現(xiàn)在算法中,在數(shù)學(xué)中也有很多的使用,比如一個算法經(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

注:字符串是一個容器,也是一個迭代器,for語句能使得迭代器的功能以輸出到控制臺的方式實現(xiàn),每一次從此容器中依次取出一個數(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個BIF(Built-in Functions,內(nèi)置函數(shù))
    • iter() -----調(diào)用iter()得到與之對應(yīng)的迭代器
    • next() -----調(diào)用此方法,迭代器返回下一個值
    • StopIteration異常:迭代器沒有值返回時,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
  • 方法實現(xiàn)
    • __iter()__
    • __next()__
    • 迭代器必須實現(xiàn)__iter__()的方法,因為通過此方法才能返回迭代器本身。除此之外,還需要重寫__next__()方法,用此方法可以使得迭代器按照我們自己定義的規(guī)則進(jìn)行迭代。
斐波那契數(shù)列
In [1]: class Fibonacci:
   ...:     def __init__(self,n = 10):#n=10是一個范圍
   ...:         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:  #判斷是否還有下一個輸出,如果沒有則拋出異常
   ...:             raise StopIteration
   ...:         return self.a

In [2]: fibonaccis = Fibonacci()#類的實例化

In [3]: for fibonacci in fibonaccis:  #迭代生成此數(shù)列
   ...:     print(fibonacci,end=' ') #end=' '可以理解為循環(huán)打印時不換行,以空格分開
   ...:     
1 1 2 3 5 8 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容