可迭代对象
可迭代协议
我们现在是从结果分析原因,能被for循环的就是“可迭代的”,但是如果正着想,for怎么知道谁是可迭代的呢?
假如我们自己写了一个数据类型,希望这个数据类型里的东西也可以使用for被一个一个的取出来,那我们就必须满足for的要求。这个要求就叫做“协议”。
可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了iter方法。
如果这个对象中有_ iter _()方法,这个对象就是可迭代对象
if ‘iter’ in dir(str)
1
通俗易懂 :可以被for循环迭代的对象就是可迭代对象。
isinstance()判断一个对象是否是Iterable对象:
from collections import Iterable
# 判断对象是否可迭代
data=(1,2,3,4,5,6)
print(isinstance(data,Iterable)) # 返回为True则为可迭代
# isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
data1=[1,2,3,4,5,6]
print(isinstance(data1,Iterable))
data2='1,2,3,4,5,6'
print(isinstance(data2,Iterable))
迭代器
迭代器是什么
迭代器只不过是一个实现迭代器协议的容器对象。它基于两个方法:
next 返回容器的下一个项目
_ iter _ 返回迭代器本身
from collections import Iterable
# 判断对象是否可迭代
data=(1,2,3,4,5,6)
print(isinstance(data,Iterable)) # 返回为True则为可迭代
# isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
data1=[1,2,3,4,5,6]
print(isinstance(data1,Iterable))
data2='1,2,3,4,5,6'
print(isinstance(data2,Iterable))
data_iter=iter(data)
while True:
try:
i=next(data_iter)
print(i)
except StopIteration as e:
print('迭代完成')
break
#else:
#print(i)
for i in data:
print(i)
# for 实现迭代的过程
class Mylist(object):
'''只进行追加操作'''
def __init__(self):
self.iter=[]
def add(self,par):
self.iter.append(par)
def __iter__(self):
'''表示对象可迭代'''
myiter=MyIter(self.iter)
return myiter
class MyIter(object):
'''实现迭代器'''
'''一个实现了iter和next方法的对象叫做迭代器'''
def __init__(self,mylist):
self.mylist=mylist
self.current_index=0
def __next__(self):
if self.current_index<len(self.mylist):
self.current_index += 1
return self.mylist[self.current_index-1]
else:
raise StopIteration
# raise 主动抛出错误
# 停止迭代
def __iter__(self):
return self
mylist=Mylist()
for i in range(10):
mylist.add(i)
for i in mylist:
print(i)