python中的迭代器

本文介绍了Python中的迭代器,包括其作为访问集合元素的方式、如何记住遍历位置以及如何通过`__iter__()`和`__next__()`方法创建迭代器。通过实例展示了字典迭代器的使用,探讨了如何避免无限循环问题,并通过StopIteration异常来控制迭代。文章适合初学者,旨在帮助理解迭代器的工作原理和使用技巧。
摘要由CSDN通过智能技术生成

        作为一个被学校老师水到不得了(外加上课好好自学被扣表现分等一系列令人。。。的事)的新手小白,总是被迫自己通过查资料和整理来巩固知识。

        哎,命苦啊,希望大家都能碰上好老师吧。

        这是第一篇发表的博客吧,大多也来自于自己日常的了解与整理,希望对于更多想要了解Python中迭代器的同学有所帮助,如果觉得不戳,也希望得到大家的肯定与支持。当然,犯错了也希望得到大家的纠正,共同进步嘛。(老师不好就靠网上的大佬!)

       

        首先,什么是迭代器?

        是访问集合元素的一种方式。

        是一个可以记住遍历的位置的对象。

        迭代器对象从集合的首个元素开始一一访问,直到所有的元素被访问完结束。像极了象棋中的‘兵’,只能往前不会后退。

        当然,不只是集合啦,列表,字符串,元组还有字典对象都可用于创建迭代器。

如下图:

 

 

d = {
  'w' : '表',
  'h' : '演',
  '队' :'才',
  '长' :'艺'
}
lt = iter(d)

print (next(lt))
print (next(lt))
print (next(lt))
print (next(lt))

 (上图用字典对象来创建迭代器输出结果竟然只有键!且不是乱序!)

d = {
  'w' : '表',
  'h' : '演',
  '队' :'才',
  '长' :'艺'
}
for i in d.values():
    lt = iter(i)
    print (next(lt))

(上图用value和循环来弄可以弄出值来,但是感觉有点小麻烦)

至于能不能弄出键-值对,怎么弄出来,我只能说:I’m so vegetable!(手动一个滑稽)

过会再想想吧,弄出来会补充的,当然欢迎大佬教学,评论区见!

当然,‘lt’是可以用循环遍历的。(上面那个字典的值那里也用了,但是感觉效果不太好。)

         不过如果是字典的话应该是无序的吧,原因这里就不详述了(懒了,哈哈哈)

好了,如果你也是个新手小白,看完上面几张图一定会感到疑惑,iter()和next()是什么?怎么用?

        这么说吧,要把对象/类创建为迭代器,必须为对象实现 __iter__() 。

        如果你学过面向对象你就会知道,所有类都需要一个__init__() 的函数,它使您在创建对象时进行一些初始化。

        __iter__() 方法的作用与__init__()相似,您可以执行操作(初始化等),但必须始终返回迭代器对象本身。

        __next__() 方法也允许您执行操作,并且必须返回序列中的下一个项目,差不多就是用来遍历的,可以理解为手动的for循环吧,一个一个地输出。        

        来来来,划重点,__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法。

        简单说,先def __iter__(),再def__next__()。

下图是网上比较经典的例子(意思就是这代码基本上是我ctrl+c和ctrl+v的,当然要修改一点点的啦):

class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x

myclass = MyNumbers()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))
print(next(myiter))

  输出结果(自己换行哈,这里为了好看就不严谨一波了):1,2,3

        有一个问题哈:

        如果我们的__next__()方法过多或者我们再for循环中使用,可能造成无限循环的情况出现,怎么办呢?

        在 __next__() 方法中,如果迭代完成了一定的次数,我们可以主动抛出一个异常来引发错误,从而终止循环。而这个异常,叫做StopIteration

        而主动抛出异常,需要使用raise

        简言之,作用与break相似。

下图又是一个经典样例(是的,我懒病又犯了,所以又从网上“整理”了一份代码,哈哈哈):

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 13:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

当通过迭代器输出的数超过13,就会因为触发StopIteration异常而停止继续运行。

最后进行一下对于python中迭代器的总结吧。

可以被next()调用,不断返回下一个值的对象称为迭代器

使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。使用迭代器不仅节省内存空间,也可以显著提升代码运行速度

迭代器通过方法__iter__()进行创建,可以用for循环与方法__next__()进行遍历

本文构成:网上到处借鉴+自我整理与理解,相当于自己的一份公开笔记吧

小白发文,多有缺陷,望指点与建议,会一直努力上进的。

若对你有帮助,十分高兴,也希望得到你的支持(懂的都懂,对吧?)。

生成器之后也肯定会写的,找时间吧。

​​​​​​Python3 迭代器与生成器 | 菜鸟教程 (runoob.com)

挺好的网站,挺适合像我这样的新手用来自学的,本文中部分资料来自于此。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值