迭代器定义
迭代器类型的定义:
1. 当类中定义了__iter__ 和__next__两个方法
2. __iter__方法需要返回对象本身,即self
3. __next__方法,返回下一个数据,如果没有数据,抛出StopIteration异常
创建迭代器类型:
class IT(object):
def __iter__(self):
return self
def __init__(self):
self.counter = 0
def __next__(self):
self.counter += 1
if self.counter == 3:
raise StopIteration()
return self.counter
根据类实例化创建一个迭代器对象:
obj1 = IT()
v1 = next(obj1) # obj1.__next__()
print(v1)
v2 = next(obj1)
print(v2)
v3 = next(obj1) # 抛异常
print(v3)
obj2 = IT()
for item in obj2:
print(item)
迭代器对象支持通过next取值,如果取值结束抛出StopIteration
for循环时,先执行__iter__方法,获取一个迭代器对象,然后不断执行next取值,直到抛出异常
迭代器原理:
1.类实例化 2.类成员属性保存每次状态值 3.next实现每次迭代,所以__next__中要有终止条件
生成器
创建生成器函数
def func():
yield 1
yield 2
创建生成器对象(内部是根据生成器类generator创建对象),生成器类(generator)的内部也声明了__iter__、__next__方法
obj1 = func()
v1 = next(obj1)
print(v1)
v2 = next(obj1)
print(v2)
v3 = next(obj1)
print(v3)
obj2 = func()
for item in obj2:
print(item)
如果按照迭代器的定义来看,其实生成器类是一种特殊的迭代器类(生成器也是一种特殊迭代器) 只是 生成器 定义方式比 迭代器 更简单,采用函数方式,没有StopIteration异常终止迭代
可迭代对象(生成器对象)
定义:
如果一个类中有__iter__方法且返回一个迭代器对象;则我们称以这个类创建的对象为可迭代对象
class Foo(object):
def __iter__(self):
return 迭代器对象(yield 生成器对象)
obj = Foo() # obj是可迭代对象
可迭代对象是可以使用for来进行循环,在循环的内部是先执行__iter__方法,获取其迭代器对象,然后在内部执行这个迭代器对象的next功能,逐步取值
for item in obj:
pass
例子:
class IT(object):
def __init__(self):
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(object):
def __iter__(self):
return IT()
obj = Foo() #可迭代对象
for item in obj: # 循环可迭代对象时,内部先执行obj.__iter__获取迭代器对象;再不断执行迭代器对象next方法
print(item)
对 python 内置可迭代对象 range() 测试
v = range(100)
dir(v) # v是可迭代对象:存在__iter__方法,不存在__next__
v2 = v.__iter__()
dir(v2) # v2为迭代器,存在__iter__ __next__ 方法
基于可迭代对象&迭代器实现:自定义range
class IterRange(object): # 定义迭代器
def __init__(self, num):
slef.num = num
self.counter = -1
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter == self.num:
raise StopIteration()
return self.counter
class MyRange(object):
def __init__(self, maxnum)
self.maxnum = maxnum
def __iter__(self):
return IterRange(self.maxnum) # __iter__返回迭代器对象
obj = MyRange(10)
for item in obj:
print(item)
可迭代对象: 使用生成器实现可迭代对象
class Foo(object):
def __iter__(slef):
yield 1 # 生成器,不同于迭代器:函数方式实现,不用实现__next__
yield 2 # 不使用 StopIteration 终止;需要终止迭代条件
obj = Foo()
for item in obj:
print(item)
基于可迭代对象&生成器实现:自定义range
class MyRange(object):
def __init__(self, maxnum):
self.maxnum = maxnum
self.counter = -1
def __iter__(self):
while self.counter < self.maxnum: # 迭代器终止有StopIteration()异常,不用循环;生成器需要循环、终止条件, 体会二者编写风格
self.counter += 1
yield self.counter
obj = MyRange(10)
for item in obj:
print(item)
可迭代对象&迭代器 判定
判断常见数据类型是否可迭代对象&迭代器
from collections.abc import Iterator,Iterable
v1 = [1,2,3]
print(isinstance(v1,Iterator))
print(isinstance(v1,Iterable))
v2 = v1.__iter__()
print(isinstance(v2,Iterator))
print(isinstance(v2,iterable))
总结:
参考资料:
python迭代器(Iterator)、生成器(Generator)和生成器表达式(Generator expressions)