Python之Iterable(可迭代对象)

参考文章: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(),很容易混淆,它们是各自独立的方法哦

上一篇:Python内置all(iterable)函数


下一篇:我不喜欢采用两个或更多迭代的Python函数.这是个好主意吗?