一 前言
环境: python 3.10 win10
二 Iterator(迭代器)
Iterator 是python的内置类型之一,看下其定义
该类型的实例对象称之为iterator(迭代器对象)
要得到一个iterator(迭代器对象),可用内置函数iter()将 list tuple等转成迭代器对象
也可以自定义一个迭代器类型的class,该class的实例对象就是迭代器对象
迭代器对象需要支持一下两个方法:
-
iterator.iter(): 返回迭代器对象本身()
-
iterator.next():重复调用该方法,将逐个返回迭代器中的数据,如果已经没有可返回的项,则会引发 StopIteration 异常
下面自定义一个迭代器对象的class,该class的迭代器对象通过__next__()或者内置函数next()能不断返回偶数
实际使用中,并不需要一直重复调用next(),因为迭代器对象也一定是后面讲的可迭代对象,所以。可直接将迭代器用于for循环中,不断返回其中的数据
注意,上图中第一次调用Get_num()方法时,并没有打印出数据
因为这时候使用的迭代器对象it和之前代码中next(it)的it是同一个对象,而之前该迭代器对象已经输出到数字6,这时候再调用Get_num()方法,方法中for循环其实也是不断调用next()方法,所以此时Get_num()中得到的数字是8,而数字8遇到break就不会打印出来
第二次调用Get_num(),我们重新生成了一个迭代器对象作为参数传了进去,和之前的不是一个对象,作为一个全新的迭代器对象,此时就会按照class的定义从0开始输出
用内置函数转换得到的迭代器对象也有上面两个方法
判断一个对象是否是否是Iterator类型
三 Iterable(可迭代)
Iterable也是一种类型即class ,看下其定义
这种类型的对象称为可迭代对象,它是一种能够逐个返回其成员项的对象。 可迭代对象的例子包括所有序列类型(如 list, str 和 tuple 等)以及某些非序列类型如 dict, 文件对象 以及任何定义了 iter() 方法或实现了 sequence 语义的 getitem() 方法的自定义类的对象。
由上面可知,迭代器对象一定是可迭代对象,因为迭代器对象肯定支持__iter__()方法,class的定义也显示Iterator继承自Iterable
反过来,可迭代对象不一定是迭代器
英语单词iterate本就有迭代、重复、反复之意。
可迭代对象可用于for循环,不断得到其中的数据
判断是否是可迭代对象