ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python 可迭代对象、迭代器、生成器详解

2022-07-07 18:34:53  阅读:213  来源: 互联网

标签:__ 迭代 python 生成器 iter 对象 getitem


学习目标

  • 学习迭代器是为了学习生成器,学习生成器是为了学习协程,协程就是实现多任务的一种方式

  • 知道什么是可迭代对象,能够使用isinstance检测对象是否可迭代

  • 知道使用iter函数可以获取可迭代对象的迭代器

  • 知道使用next函数可以获得迭代器数据

 

一、可迭代对象、迭代器、生成器三者之间的联系

先看一张图:

官网文档地址

从上图中可以看出:

Iterable(可迭代对象)、Iterator(迭代器)、genetator(生成器)关系如下:

  • 可迭代对象 有 __iter__方法
  • 迭代器继承了可迭代对象,有 __iter__、__next__ 这两个方法
  • 生成器又继承了迭代器,有 send、close、 __iter__、__next__ 等方法

 

 二、可迭代对象详解

1、介绍:

可迭代对象就是能够通过for循环迭代,逐一返回其成员项的对象称为可迭代对象, python中可迭代对象包括

  • 所有序列类型 :如 list、 str 和 tuplerange
  • 非序列类型: dictset文件对象
  • 实现了 __iter__() 方法的任意对象
  • 实现了序列语义的 __getitem__()方法的任意对象。 注意点:实现了`__getitem__`方法的被称为可迭代对象(支持迭代操作),但不是Iterable类型

2、__iter__()即(迭代协议)

__iter__() 在python中也被称作迭代协议,只要对象拥有 __iter__() 方法,那么该对象就实现了迭代协议,就可以进行迭代操作。
 __iter__()方法的返回值必须是一个迭代器(后面讲解迭代器)

如下代码:自定义可迭代对象类

class MyList:
    def __iter__(self):
        return iter([1,2,3,4,5])

ml = MyList()
for i in ml:
    print(i)

 输出结果如下:

1

2

3

4

5

 

 

3、 __getitem__()方法

__getitem__()是用来实现序列类型数据索引取值的魔术方法。python中的str、list、dict等类型的数据均实现了该方法。

li = [11,22,33]
dic = {'a':11,'b':22}
# 列表索引取值,本质上调用的是 li.__getitem__(1)方法去取值的。
li[1]

如下代码:自定义可迭代对象类

class Mylist2:
    """自定义的序列类类"""
    li = ['a1', 'a2', 'a3', 'a4']
    def __getitem__(self, item):
        # iten是for循环内部传进来的索引值,从0开始
        return self.li[item]
  
if __name__ == '__main__':
    m2 = Mylist2()
    for i in m2:
        print(i)

执行结果:

a1
a2
a3
a4

从上面的案例中我们可以看到我们在遍历Mylist2这个类的对象时,其实就是不断的调用对象的__getitem__方法来获取遍历出来的值

 

4、for循环迭代到底干了啥

4.1 __iter__()

当我们用for去遍历任何一个对象时,for循环执行的时候,会先去调用对象的 __iter__(),根据__iter__()返回的迭代器,再进行迭代操作

4.2 __getitem__()

for循环遍历对象的时候,会先去调用对象的 __iter__() 方法,如果对象没有定义 __iter__() 方法,那么for在遍历的时候,就会从索引 0 开始,循环调用__getitem__(),,把__getitem__()的返回值,作为遍历出来的数据,直到__getitem__()中抛出异常,则终止循环。

标签:__,迭代,python,生成器,iter,对象,getitem
来源: https://www.cnblogs.com/sgfg-1314/p/16455710.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有