【Python】迭代器,可迭代对象与生成器
迭代器
迭代器类型的定义:
- 当类中定义了__iter__和__next__两个方法。
- __iter__方法需要返回对象本身,即返回self。
- __next__方法,返回下一个数据,如果没有数据了,则需要抛出一个StopIteration的异常。
# 创建 迭代器类型
class IterExample():
def __init__(self) -> None:
self.counter = 0
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter == 3:
raise StopIteration()
return self.counter
# 根据类实例化创建一个迭代器对象
iterExObj = IterExample()
# 这个最多能执行3次,3次之后就抛出StopIteration错误
v1 = iterExObj.__next__()
# 也可以这么执行,等价于
v1 = next(iterExObj)
# 迭代器对象支持for循环
for i in IterExample():
# 首先会执行迭代器对象的__iter__方法并获取返回值,一直去反复的执行: next(IterExample())
print(i)
- 迭代器对象支持通过next取值,如果取值结束则自动抛出StopIteration。
- for循环内部在循环时,先执行迭代器对象的__iter__方法并获取返回值,一直去反复的执行: next(IterExample())取值。有异常StopIteration则终止循环。
- 迭代器更多的是为for循环提供一个逐步获取下一份数据的作用。
生成器
生成器类也是一种特殊的迭代器类(生成器也是一个特殊的迭代器)
# 创建生成器对象,在函数后面加()
# 生成器对象内部是根据生成器类generator创建的对象,内部也声明了__iter__和__next__方法
yObj = func()
v1 = next(yObj)
for i in func():
print(i)
可迭代对象
- 如果一个类有__iter__方法且返回一个迭代器对象(生成器对象),则这个对象为可迭代对象。
- 可迭代对象可以被for循环。
可迭代对象和迭代器的区别
- 可迭代对象返回的是一个迭代器对象,for循环是对这个迭代器对象进行循环。
- 迭代器返回的是自身(self),for是对这个迭代器进行循环。
- 可迭代器对象没有__next__方法,__iter__返回的是一个迭代器。
# 创建 迭代器类型
class IterExample():
def __init__(self) -> None:
self.counter = 0
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter == 3:
raise StopIteration()
return self.counter
# 创建 可迭代类
class Foo():
def __iter__(self):
return IterExample()
对可迭代对象进行for循环时,内部会先执行obj.__iter__获取迭代器对象,再对这个迭代器对象执行next()
range()
range函数会返回一个可迭代对象,一般放在for循环里用。
常见的可迭代数据类型
- list
- set
- tuple
判断是否是迭代器还是可迭代对象
v1 = [1, 2, 3, 4]
# 判断是否为可迭代对象,判断依据是是否有__iter__且返回可迭代器对象
print(isinstance(v1, Iterable))
# 判断是否迭代器,判断依据是__iter__和__next__
print(isinstance(v1, Iterator))