python中的迭代器(以斐波那契数列为主讲解)

  • 简要引入:
    迭代一词,我们再熟悉不过了,它经常出现在算法中,在数学中也有很多的使用,比如一个算法经过多少次的迭代,执行的效率有了很大的提高……
    迭代的意思类似于循环,每一次重复的过程被称为一次迭代的过程,而每一次迭代出现的结果将作为下一次迭代的初始值。
  • 迭代器:提供迭代方法的容器。
    如: 序列(列表、元祖、字符串),字典
练习1
#for循环来进行迭代
In [2]: for i in "Python":
   ...:     print(i)
   ...:     
P
y
t
h
o
n

注:字符串是一个容器,也是一个迭代器,for语句能使得迭代器的功能以输出到控制台的方式实现,每一次从此容器中依次取出一个数据,这就是迭代操作。(字典、文件同样支持迭代)

练习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中关于迭代器的2个BIF(Built-in Functions,内置函数)
    • iter() -----调用iter()得到与之对应的迭代器
    • next() -----调用此方法,迭代器返回下一个值
    • StopIteration异常:迭代器没有值返回时,Python会抛出此异常,结束操作
练习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'
#最后抛出异常结束如下所示:
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
  • 方法实现
    • __iter()__
    • __next()__
    • 迭代器必须实现__iter__()的方法,因为通过此方法才能返回迭代器本身。除此之外,还需要重写__next__()方法,用此方法可以使得迭代器按照我们自己定义的规则进行迭代。
斐波那契数列
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:  #迭代生成此数列
   ...:     print(fibonacci,end=' ') #end=' '可以理解为循环打印时不换行,以空格分开
   ...:     
1 1 2 3 5 8 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容