python 迭代器,生成器,可迭代对象
迭代器
迭代器定义: 当类中定义了__iter__,和__next__ 两个方法
其中 ‘iter’ 返回对象本身,self
‘next’ 返回下一个数据,如果数据取完了,则抛出一个StopIteration的异常。
这个是我们日常中使用最多的特殊方法。
# 创建迭代器
class Iter_test:
def __init__(self,count):
self.count = count
self.num = 0
def __iter__(self):
return self
def __next__(self):
self.num += 1
if self.num == self.count:
raise StopIteration
return self.num
obj = Iter_test(10)
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__()) # 当连续输出第10次的时候,报错异常
for i in obj: # 很range 的输出结果一样,首先执行__iter__方法,获取一个迭代器对象,然后不断的执行next方法,知道有StopIteration异常为止
print(i)
生成器:生成器是一种特殊的迭代器
def func(): # 一个最简单的生成器
yield 1
yield 2
obj = func()
#next(obj)
#next(obj)
for i in obj: # 同样的放回生成器中的__next__方法
print(i)
这边说一下dir()方法,dir(对象) 可以展示出对象中的所有方法
# dir(类)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'count', 'num']
结合dir的展示,我们可以发现,迭代器对象和迭代器中都包含__iter__ 和 next 方法,所以说,生成器也是一种特殊的迭代器
可迭代对象: 一个类中有__iter__方法,且返回一个迭代器对象。
class Iter_test:
def __iter__(self):
return 可迭代对象
obj = Iter_test() #obj就是可迭代对象
print(dir(obj))
#['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 里面只有一个__iter__方法,这个方法返回的是迭代器对象。
# obj.__iter__ 是一个可迭代器对象