参考文章:https://www.cnblogs.com/new-rain/p/9991932.html 我觉得写的不错
0、在Python中只要是能用for in的,都是可迭代对象,让我们看下定义
定义:我们已经知道可以对list、tuple、dict、set、str等类型的数据使用for...in...的循环语法,会从其中依次拿到数据元素进行使用,我们把这样的过程称为遍历,也叫迭代。
所以我们把可以通过for...in...这类语句迭代读取一条数据元素供我们使用的---->对象就称之为可迭代对象(Iterable)
1、可迭代对象,可不是必须是支持有下标,比如dict就没有下标的 (支持下标操作的是__getitem__方法)
2、可以使用 isinstance()函数 判断一个对象是否是 Iterable 对象,Itrerable位于collections下
from collections import Iterable(已经废弃,现在使用from collections.abc import Iterable)
isinstance(xx,Iterable)
3、那么可迭代对象到底里面干了什么呢?(原理)迭代器对象出现了!!!
我们分析对可迭代对象进行迭代(遍历)使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条元素,一直向后读取元素,直到迭代了所有元素后才会结束。
那么,在这个迭代过程中就应该有一个“记录员”去记录每次访问到了第几条元素,以便每次迭代都可以返回下一条元素
我们把这个能帮助我们进行数据迭代的“记录员”称为迭代器(Iterator)。可迭代对象的本质就是可以向我们提供一个这样的“记录员”即迭代器对帮助我们对其进行迭代遍历使用
Iterator对象,很重要哦
4、可迭代对象通过__iter__方法向我们提供一个迭代器对象(Iterator),我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器对象(Iterator),然后通过这个迭代器来依次获取对象中的每一个元素。
重点:那么也就是说,一个具备了__iter__方法的对象,就是一个可迭代对象
5、我们先写一个例子,其中创建的对象,不是一个可迭代对象
from collections.abc import Iterable
class MyTestIterable(object):
pass
myIterable = MyTestIterable()
print(isinstance(myIterable,Iterable))
输出结果:
False
6、加入 __iter__方法,里面将类创建的实例对象变为了可迭代对象
from collections.abc import Iterable
class MyTestIterable(object):
def __iter__(self):
pass
myIterable = MyTestIterable()
print(isinstance(myIterable,Iterable))
输出结果:
True
7、第5和第6两个例子,充分说明一个具备了__iter__方法的对象,就是一个可迭代对象
8、再思考一下,上面判断可迭代对象的时候,都是传入的某一个类的实例对象,如果我们传递进入一个class对象呢,我这简直就是扩展思考,刚试了一下,不靠谱…………
9、iter()函数与next()函数
在builtins.py模块下,有这两个内置函数哈,牛批
iter()接受一个Iterable对象,返回可迭代对象对应的一个Iterator对象
10、注意一下魔法方法__iter__与iter(),很容易混淆,它们是各自独立的方法哦