python中的Iterator与Iterable(迭代器与可迭代)

一 前言

环境: python 3.10 win10

二 Iterator(迭代器)

Iterator 是python的内置类型之一,看下其定义
image

该类型的实例对象称之为iterator(迭代器对象)
要得到一个iterator(迭代器对象),可用内置函数iter()将 list tuple等转成迭代器对象
也可以自定义一个迭代器类型的class,该class的实例对象就是迭代器对象

迭代器对象需要支持一下两个方法:

  • iterator.iter(): 返回迭代器对象本身()

  • iterator.next():重复调用该方法,将逐个返回迭代器中的数据,如果已经没有可返回的项,则会引发 StopIteration 异常

下面自定义一个迭代器对象的class,该class的迭代器对象通过__next__()或者内置函数next()能不断返回偶数
image

实际使用中,并不需要一直重复调用next(),因为迭代器对象也一定是后面讲的可迭代对象,所以。可直接将迭代器用于for循环中,不断返回其中的数据
image

注意,上图中第一次调用Get_num()方法时,并没有打印出数据
因为这时候使用的迭代器对象it和之前代码中next(it)的it是同一个对象,而之前该迭代器对象已经输出到数字6,这时候再调用Get_num()方法,方法中for循环其实也是不断调用next()方法,所以此时Get_num()中得到的数字是8,而数字8遇到break就不会打印出来

第二次调用Get_num(),我们重新生成了一个迭代器对象作为参数传了进去,和之前的不是一个对象,作为一个全新的迭代器对象,此时就会按照class的定义从0开始输出

用内置函数转换得到的迭代器对象也有上面两个方法
image

判断一个对象是否是否是Iterator类型
image

三 Iterable(可迭代)

Iterable也是一种类型即class ,看下其定义
image

这种类型的对象称为可迭代对象,它是一种能够逐个返回其成员项的对象。 可迭代对象的例子包括所有序列类型(如 list, str 和 tuple 等)以及某些非序列类型如 dict, 文件对象 以及任何定义了 iter() 方法或实现了 sequence 语义的 getitem() 方法的自定义类的对象。

由上面可知,迭代器对象一定是可迭代对象,因为迭代器对象肯定支持__iter__()方法,class的定义也显示Iterator继承自Iterable
反过来,可迭代对象不一定是迭代器

英语单词iterate本就有迭代、重复、反复之意。
可迭代对象可用于for循环,不断得到其中的数据

判断一个对象是否是可迭代类型
image

posted @ 2024-07-28 23:24  工作手记  阅读(8)  评论(0编辑  收藏  举报