day01-迭代器
1.迭代是什么?
迭代是访问集合元素的一种方式
简单来说:就是一种取数据的方式,即在上一个的基础上取下一个
for x in [11,22,33,44,55]
print(x)
2.迭代器是什么?
迭代器(Iterator)有时又称游标(cursor)是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。(迭代器只能往前不会后退)
3.什么是可迭代对象
能够通过for…in…迭代读取数据的对象叫做可迭代对象
4.怎样让一个普通class对象,可以使用for?
让其成为迭代器,拥有两个魔法方法
__iter__
__next__
5.怎样判断一个对象是否可以迭代
通过isinstance来判断出是Iterable类的实例,即isinstance的结果是True那么就表示,这个数据类型是可以迭代的数据类型
print(isinstance('halon',Iterable)) #True
print(isinstance(12345,Iterable)) #False
print(isinstance([1, 2, 3, 4],Iterable)) #True
print(isinstance((1, 2, 3),Iterable)) #True
print(isinstance({4, 5, 6},Iterable)) #True
6.怎么判断是否是迭代器
from collections.abc import Iterator
nums = [11, 22, 33, 44]
nums_iter = iter(nums)
# 查看类型
print(type(nums))
print(type(nums_iter))
# 判断是不是迭代器
print("nums", isinstance(nums, Iterator))
print("nums_iter", isinstance(nums_iter, Iterator))
7.__iter__方法
只要在类中,定义__iter__方法,那么这个类创建出来的对象一定是可迭代对象,即具备了__iter__方法的对象,就是一个可迭代对象
class MyList(object):
def __init__(self):
self.container = []
def add(self, item):
self.container.append(item)
def __iter__(self):
pass
mylist = MyList()
mylist.add(11)
mylist.add(22)
mylist.add(33)
for temp in mylist:
print(temp)
8.__next__方法
使用next()函数的时候,调用的就是迭代器对象的__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)