可迭代对象:可以直接作用于 for 循环的数据类型有以下几种:一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。这些可以直接作用于for循环的对象统称为可迭代对象:Iterable
这些可迭代对象在其类中都有 __iter__()
方法,使用 for 循环时就是调用了这些对象的 __iter__()
方法生成迭代器(对象)。
迭代器(对象):迭代器对象中定义了一个__next__()
方法,其中定义了迭代的算法
from collections.abc import Iterable
from collections.abc import Iterator
class NumSort():
def __init__(self, m):
self.m = m
def __iter__(self):
print('***')
return NumSortiter(self.m)
class NumSortiter():
def __init__(self, num):
self.num = num
def __iter__(self):
return self
def __next__(self):
# print(self.num)
if self.num == 0:
raise StopIteration
while self.num > 0:
self.num = self.num - 1
return self.num + 1
N = NumSort(5)
for n in N:
print(n)
print(isinstance(N, Iterable)) # 判断自己定义的类对象是否是可迭代对象
print(isinstance(NumSortiter(3), Iterator)) # 判断自己定义的类对象是否是迭代器对象
============================================
结果:
***
5
4
3
2
1
True
True
代码解释:自己定义一个可迭代对象 NumSort() (类中有 __iter__()
方法),,再定义该可迭代对象的迭代器对象(NumSortiter())。
当执行 for 循环时,会用 Python 内置函数 iter() 调用可迭代对象的 __iter__()
方法,返回迭代器,然后用 Python 内置函数 next() 调用迭代器对象的 __next__()
方法。每执行一次 for 循环都会调用一次迭代器中的 __next__()
方法,如果迭代器的 __next__()
方法中不添加抛出的 StopIteration
异常,for 循环会一直运行下去,所以需要在其中添加判断条件结束迭代。
生成器是一类特殊的迭代器。
生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()
和__next__()
方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。
参考博客:
1. 有疑问看这一篇吧
2. 廖雪峰Python