Python-迭代器-Python自学笔记4

本章重点

  • 可迭代对象
    • 迭代的概念
    • 可迭代对象
      • 判断一个对象是否是可迭代对象
  • 迭代器
    • 什么是迭代器
    • 迭代器的作用
    • 怎么生成一个迭代器
    • 迭代器的用法
    • 迭代器的优点
    • 迭代器的缺点

可迭代对象

迭代的概念

学习可迭代对象前我们应该了解一下迭代的概念

以下是我在维基百科中找到的关于迭代的定义:

  • 迭代重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。

  • 用代码解释:

    • 实例1----非迭代

    • i = 0
        while i < 5:
          	print("Python 是世界上最好的语言")
          	i += 1
          ````
      
    • 实例2----迭代

    •    i = 0
         	while i < 5:
             print(i)
             i += 1
      
    • 上面这两段代码看着很相似,但是为什么实例1是非迭代而实例2却是迭代呢?其实是因为实例1仅仅是重复打印了5次Python 是世界上最好的语言",它所输出的内容并不依赖上一次的数据,所以不能算迭代。

    • 而实例2每次输出的结果都是基于上一次的数据+=1 所以是迭代。

可迭代对象

  • 可迭代对象,并不是某种具体的数据类型,它是指存储了元素的一个容器对象。且这个容器对象包拥有__iter____getitem__方法。

  • 那么如何确定一个对象是否是可迭代对象:

    思路:上面提到了,有__iter__ 方法的对象就是可迭代对象,我们只需要查看这个对象的所有方法,再看里面有没有 __iter__方法。

    我们可以使用python内置方法dir()查看一个对象的所有方法。

    例如:

    l = [1,2,3,4,5,6]
    print(dir(l))
    

    结果:

    • ['__add__', '__class__', '__contains__', '__delattr__',
       '__delitem__', '__dir__', '__doc__', '__eq__',
       '__format__', '__ge__', '__getattribute__',
       '__getitem__', '__gt__', '__hash__', '__iadd__',
       '__imul__', '__init__', '__init_subclass__', '__iter__',
       '__le__', '__len__', '__lt__', '__mul__', '__ne__',
       '__new__', '__reduce__', '__reduce_ex__', '__repr__',
       '__reversed__', '__rmul__', '__setattr__', '__setitem__',
       '__sizeof__', '__str__', '__subclasshook__', 'append',
       'clear', 'copy', 'count', 'extend', 'index', 'insert',
       'pop', 'remove', 'reverse', 'sort']
      

      内置方法dir()会获取对象的所有方法并返回一个列表,且列表内的每一个元素都是以字符串形式表现

      上方的返回结果里面有__iter____getitem__方法,我们可以确定列表就是一个可迭代对象。但这样子一次性返回这么多方法,我们要一个个去看,这显然不够直观,现在我们用我们以前学过的内容,搭配dir()方法确定该对象是不是可迭代对象。

      自己先尝试写一下,写完再点开看
       
       print(('__iter__' in dir(l)) or ('__getitem__' in dir(l)))
       结果 >>> True
        

迭代器

什么是迭代器

GOF给迭代器的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

迭代器就是为了实现不同集合进行统一遍历的一种机制。

内部含有 __next__ 方法的对象都是迭代器

迭代器的作用

从上面这句定义我们可以看出 迭代器 就是为了容器而生,而迭代器需要做的事就是将容器中的元素一个一个取出来。

怎么创建迭代器对象(两种方法)

创建迭代器之前,我们需要先知道,用于创建迭代器的对象必须是可迭代对象,

str list dict set 等,这种可迭代对象都可以用于创建迭代器。

  • 使用内置函数创建迭代器对象 (iter(obj))

    • li = [1, 2, 3, 4]
      iter_obj = iter(li)  # 迭代器对象
      
  • 使用对象方法创建迭代器对象 (obj.__iter__())

    • str_ = "Hello Python"
      iter_obj = str_.__iter__()  # 迭代器对象
      

迭代器的用法

迭代器是不能直接查看里面的元素的,需要使用 next(iter_obj) 进行取值,且使用一次next() 取一个元素,且取值次数只能和元素个数一样,否则将报 StopIteration 错误

迭代器里的每个元素只能取值一次,所以不能还原迭代器,也就是说迭代器里面的元素取完了,这个迭代器就不能再次使用了。

实例:

  • # 创建一个列表
    li = [1, 2, 3, 4]
    # 创建这个列表的迭代器对象
    li_iter = iter(li)
    # 取值
    # 取值也可以使用 li_iter.__next__() 方法
    print(next(li_iter))
    print(next(li_iter))
    print(next(li_iter))
    print(next(li_iter))
    
  • 结果:

    • 1
    • 2
    • 3
    • 4

现在我们利用while 循环来模拟一下 for 循环遍历。

  • li = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    iter_obj = iter(li)
    while 1:
        try:  # 异常捕获
        	print(next(iter_obj))
        except StopIteration:  # 如果报了StopIteration错误就执行break
            break
    
  • 结果:

    • 1
    • 2
    • ... 345678 # 让我偷一下懒
    • 9

迭代器的优缺点

  • 优点:
    1. 节约内存
    2. 惰性机制,一次只取一个值。
  • 缺点:
    1. 速度慢
    2. 不能恢复迭代器,即同一个元素只能取一次。
posted @   假文艺青年。  阅读(50)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示