迭代器基础
from collections.abc import Iterable
"""
判断一个对象是否是一个已知的类型,类似 type()。
isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
"""
result = isinstance("hello", Iterable)
print("是否可以迭代", result)
# 迭代器
list = [1, 2, 3]
print(next(iter(list)))
"""
for 循环的本质是:
1.通过iter(遍历的对象)获取要遍历的对象的迭代器
2.next(迭代器)获取下一个元素
3.帮我们捕获StopIteration异常
"""
for i in iter(list):
print(i)
自定义List
class MyList(object):
def __init__(self):
self.item = []
def __iter__(self):
iterator = MyIterator(self.item)
return iterator
def addItem(self, data):
self.item.append(data)
class MyIterator(object):
def __init__(self, item):
self.item = item
self.index = 0
def __iter__(self):
pass
def __next__(self):
if self.index < len(self.item):
data = self.item[self.index]
self.index += 1
return data
else:
raise StopIteration
if __name__ == '__main__':
myList = MyList()
myList.addItem("GG1")
myList.addItem("GG2")
myList.addItem("GG3")
myList.addItem("GG4")
for i in myList:
print("name:", i)
案例:斐波那契数列
class iterClass(object):
# 生成迭代器
def __iter__(self):
print("__iter_called")
self.a = 0
self.b = 1
self.max = 3
return self
def __next__(self):
print("__next_called")
fib = self.a
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b
return fib
print(isinstance(iterClass(), Iterable))
if __name__ == '__main__':
for j in iterClass():
print("斐波那契数列", j)