python–编写迭代器
只含有__iter__()的是可迭代对象,其返回的应该是可以迭代的对象,例如下面的fun2()
同时含有__iter__()和__next__()的是迭代器,例如下面fun1
from collections.abc import Iterable, Iterator
#迭代器
class fun1():
def __init__(self, alist):
self.alist = alist
self.num = 0
def __iter__(self):
return self
def __next__(self):
if self.num < len(self.alist):
out = self.alist[self.num]
self.num += 1
return out
else:
raise StopIteration
f1 = fun1([1,2,3,4])
print("f1 is Iterable ?:", issubclass(type(f1), Iterable))
print("f1 is Iterator ?:", issubclass(type(f1), Iterator))
for i in f1:
print(i)
print("----------------------------------------------------------------")
#可迭代对象,不是迭代器也可以迭代
class fun2():
def __init__(self, alist):
self.alist = alist
def __iter__(self):
return itfun2(self)
class itfun2():
def __init__(self, k):
self.alist = k.alist
self.num = 0
def __next__(self):
if self.num < len(self.alist):
out = self.alist[self.num]
self.num += 1
return out
else:
raise StopIteration
f2 = fun2([1,2,3,4])
print("f2 is Iterable ?:", issubclass(type(f2), Iterable))
print("f2 is Iterator ?:", issubclass(type(f2), Iterator))
for i in f2:
print(i)
运行结果:
f1 is Iterable ?: True
f1 is Iterator ?: True
--------------------------------------------------------------
f2 is Iterable ?: True
f2 is Iterator ?: False