python 可迭代对象、迭代器、生成器详解
2022/7/8 1:20:17
本文主要是介绍python 可迭代对象、迭代器、生成器详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
学习目标
-
学习迭代器是为了学习生成器,学习生成器是为了学习协程,协程就是实现多任务的一种方式
-
知道什么是可迭代对象,能够使用isinstance检测对象是否可迭代
-
知道使用iter函数可以获取可迭代对象的迭代器
-
知道使用next函数可以获得迭代器数据
一、可迭代对象、迭代器、生成器三者之间的联系
先看一张图:
官网文档地址
从上图中可以看出:
Iterable(可迭代对象)、
Iterator(迭代器)
、genetator(生成器)关系如下:
- 可迭代对象 有 __iter__方法
- 迭代器继承了可迭代对象,有 __iter__、__next__ 这两个方法
- 生成器又继承了迭代器,有 send、close、 __iter__、__next__ 等方法
二、可迭代对象详解
1、介绍:
可迭代对象就是能够通过for循环迭代,逐一返回其成员项的对象称为可迭代对象, python中可迭代对象包括
-
所有序列类型 :如
list
、str
和tuple
、range
-
非序列类型:
dict
、set
、文件对象
-
实现了
__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 可迭代对象、迭代器、生成器详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门
- 2024-11-14Python编程入门指南
- 2024-11-13Python基础教程
- 2024-11-12Python编程基础指南
- 2024-11-12Python基础编程教程
- 2024-11-08Python编程基础与实践示例
- 2024-11-07Python编程基础指南
- 2024-11-06Python编程基础入门指南
- 2024-11-06怎么使用python 计算两个GPS的距离功能-icode9专业技术文章分享