实现了__iter__()的对象叫做可迭代对象
from typing import Iterable
class A:
def __iter__(self):
pass
print('可迭代对象', isinstance(A(), Iterable)) # 自定义对象
print('可迭代对象', isinstance('', Iterable)) # 字符串
print('可迭代对象', isinstance([], Iterable)) # 列表
print('可迭代对象', isinstance((), Iterable)) # 元组
print('可迭代对象', isinstance({}, Iterable)) # 字典
# 结果全为True
因为字符串、列表、元组、字典均实现__iter__(),所以也是可迭代对象。
实现了__iter__()和__next__()的对象叫做迭代器
from typing import Iterable, Iterator
class B:
def __iter__(self):
pass
def __next__(self):
pass
print('可迭代对象', isinstance(B(), Iterable))
print('迭代器', isinstance(B(), Iterator))
# 结果全为True
包含了yield关键字的函数调用都是生成器,因为yield会自动创建__iter__()和__next__()
from typing import Iterable, Iterator, Generator
def f():
yield
print('可迭代对象', isinstance(f(), Iterable))
print('迭代器', isinstance(f(), Iterator))
print('生成器', isinstance(f(), Generator))
# 结果全为True
可迭代对象和迭代器最大的区别——能否重复迭代
可迭代对象:能重复迭代,只能用for
迭代器:只能迭代一次,可以通过for或next()迭代
判断可迭代对象:isinstance(?, Iterable)
判断迭代器:isinstance(?, Iterator)
判断生成器:isinstance(?, Generator)
综合对比
from typing import Iterable, Iterator, Generator
class A:
'''可迭代对象'''
def __iter__(self):
pass
class B:
'''迭代器'''
def __iter__(self):
pass
def __next__(self):
pass
def f():
'''生成器'''
yield
print('可迭代对象', isinstance(A(), Iterable)) # True
print('迭代器', isinstance(A(), Iterator)) # False
print('生成器', isinstance(A(), Generator)) # False
print()
print('可迭代对象', isinstance(B(), Iterable)) # True
print('迭代器', isinstance(B(), Iterator)) # True
print('生成器', isinstance(B(), Generator)) # False
print()
print('可迭代对象', isinstance(f(), Iterable)) # True
print('迭代器', isinstance(f(), Iterator)) # True
print('生成器', isinstance(f(), Generator)) # True