可迭代对象
我们已经知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。但不是所有的数据类型的数据都能够迭代。
比如整型是不可以迭代的。自定义一个类也是不可以迭代的。
迭代对象
for temp in (1,23,4) temp就是迭代对象
判断一个对象是否可以迭代
from collections import Iterable
isinstance([], Iterable) # true
isinstance({}, Iterable) # true
isinstance('abc', Iterable) # true
isinstance(mylist, Iterable) # false 对象
isinstance(100, Iterable) # false 整型
可迭代对象的本质
可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.
也就是说,一个具备了__iter__方法的对象,就是一个可迭代对象。
iter()函数与next()函数
迭代器
一个实现了__iter__方法和__next__方法的对象,就是迭代器。
class MyList(object):
"""自定义的一个可迭代对象"""
def __init__(self):
self.items = []
def add(self, val):
self.items.append(val)
def __iter__(self):
myiterator = MyIterator(self)
return myiterator
class MyIterator(object):
"""自定义的供上面可迭代对象使用的一个迭代器"""
def __init__(self, mylist):
self.mylist = mylist
# current用来记录当前访问到的位置
self.current = 0
def __next__(self):
if self.current < len(self.mylist.items):
item = self.mylist.items[self.current]
self.current += 1
return item
else:
raise StopIteration
def __iter__(self):
return self
if __name__ == '__main__':
mylist = MyList()
mylist.add(1)
mylist.add(2)
mylist.add(3)
mylist.add(4)
mylist.add(5)
for num in mylist:
print(num)