迭代器和和迭代类型
1. 概念明确
1.1 iterable
可迭代的
class Iterable(metaclass=ABCMeta):
@abstractmethod
def __iter__(self): ...
- Iterable类型是必须要实现
__iter__
方法
1.2 iterator
迭代器
class Iterator(Iterable):
@abstractmethod
def __next__(self):
raise StopIteration
def __iter__(self):
return self
- iterator类型是必须要同时实现
__iter__
方法和__next__
方法
- 值得一提的是Iterator是继承自Iterable的
2. 如何查看对象是iterable
还是iterator
?
2.1 通过代码判断
from collections.abc import Iterable, Iterator
my_obj = [1, 2, 3]
print(isinstance(my_obj, Iterable))
print(isinstance(my_obj, Iterator))
2.2 通过是否实现相应方法
- Iterable类型是必须要实现
__iter__
方法
- iterator类型是必须要同时实现
__iter__
方法和__next__
方法
3. iter()
方法的两个作用
iter(iterable) -> iterator
:将可迭代对象转成迭代器
from collections.abc import Iterable, Iterator
my_obj = iter([1, 2, 3])
print(isinstance(my_obj, Iterable))
print(isinstance(my_obj, Iterator))
iter(callable, sentinel) -> iterator
:将可执行的对象,按照停止的条件,生成迭代器对象
import random
from collections.abc import Iterable, Iterator
def fun():
return random.randint(1, 6)
my_obj = iter(fun, 5)
for i in my_obj:
print(i)
print(isinstance(my_obj, Iterable))
print(isinstance(my_obj, Iterator)