迭代器
[!Note]
了解迭代器
Iterator,可迭代对象Iterable的概念
通俗的说,可迭代对象是一堆可以被一个一个拿起来的东西,迭代器就作为拿的工具,如果可迭代对象是一堆苹果,那么迭代器就是手,如果可迭代对象是一辆辆在生产线上整备待发的汽车,那么迭代器就是叉车。在Python一些常见的数据类型中,像list set dict map 等,包括文件在内都是可迭代对象.
官方定义:
迭代对象,需要提供
__iter__()方法,否则不能被for语句处理。迭代器必须同时实现
__iter__()和__next__()方法,__next__()方法包含了用户自定义的推导算法,这是迭代器对象的本质。
由此得出,如果一个对象是迭代器,那么它一定是可迭代对象,反之不成立,可以通过以下方法检查某个对象是不是可迭代对象或迭代器
from collections.abc import Iterable, Iterator
list = [1, 2, 3, 4]
print(isinstance(list, Iterable)) # True
print(isinstance(list, Iterator)) # False
with open("01_内置函数/test.txt", 'r', encoding='utf8') as file:
print(isinstance(file, Iterable)) # True
print(isinstance(file, Iterator)) # True
可以自定义一个类并创建实例验证以上的结论,新建一个Apple类, 先只实现__iter__方法,内部不写任何逻辑
class Apple:
def __init__(self) -> None:
self.names = ["Apple1", "Apple2", "Apple3", "Apple4"]
apple = Apple()
print(isinstance(apple, Iterable)) # False
print(isinstance(apple, Iterator)) # False
实现__iter__方法后,
class Apple:
def __init__(self) -> None:
self.names = ["Apple1", "Apple2", "Apple3", "Apple4"]
def __iter__(self)-> None:
pass
apple = Apple()
print(isinstance(apple, Iterable)) # True
print(isinstance(apple, Iterator)) # False
此时apple就已经被判定为一个可迭代对象,实现__iter__方法和__next__()方法后,
class Apple:
def __init__(self) -> None:
self.names = ["Apple1", "Apple2", "Apple3", "Apple4"]
def __iter__(self)-> None:
pass
def __next__(self)-> None:
pass
apple = Apple()
print(isinstance(apple, Iterable)) # True
print(isinstance(apple, Iterator)) # True
内置函数iter()和next()
iter()的作用是从可迭代对象那里获取一个迭代器next()的作用是从迭代器那里返回下一个值
重新声明一下Apple类中的方法,只声明__iter__(), 代表Apple的实例是一个可迭代对象
class Apple:
def __init__(self) -> None:
self.names = ["Apple1", "Apple2", "Apple3", "Apple4"]
def __iter__(self)-> None:
pass
apple = Apple()
for a in iter(apple):
print(a)