概述
#迭代是一个访问集合元素的方式
#迭代器是一个可以记住遍历位置的对象
#迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束
#迭代器只能向前不会后退
#第一种集合数据类型:列表,元组,字典,集合,字符串等
#第二种:生成器
#统称为可迭代对象
# from _collections_abc import Iterator,Iterable
#
# x = [1,2,3,'asd']
# print(isinstance(x,Iterable))
# print(isinstance(1000,Iterable))
#
# y = [x for x in range(10)]
# z = (x for x in range(10))
#
# print(type(y))
# print(type(z))
# print(isinstance(z,Iterable)) #判断是不是为可迭代对象
#
# print(iter(z))
# print(iter(y))
# print(isinstance(iter(y),Iterable))
# print(isinstance(iter(y),Iterator))
# print(isinstance(y,Iterator))
#以列表为例,列表是个可迭代对象,Iter这个方法获取的是列表内部的迭代器
#生成器是一个迭代器对象,列表或者集合等是可迭代的,但都不是迭代器
from _collections_abc import Iterable,Iterator
class Mylist(object):
def __init__(self):
self.newlist = list()
def append_item(self,data):
'''
该方法实现了增加一个元素至列表末尾
:param data:
:return:
'''
self.newlist.append(data)
def __iter__(self): #只有加上这个iter才能成为可迭代对象,不然就是普通的类
'''
当前类中,因为iter这个魔法方法获取的是__iter__方法中的迭代器
:return:
'''
iterobj = MyIterator(self.newlist)
return iterobj
class MyIterator(object):
#这个类实现的是迭代器类
def __init__(self,newlist):
self.newlist = newlist
#记录的是当前迭代的索引
self.current_index = 0
def __next__(self):
#当前的魔法方法记录遍历的位置,第二个功能是记录需要获取的值
if self.current_index< len(self.newlist):
self.current_index+=1
return self.newlist[self.current_index-1]
else:
raise StopIteration
def __iter__(self):
return self
list1 = Mylist()
print(isinstance(list1,Iterable))
print(iter(list1))
print('###########################')
obj = MyIterator([1,2,3,4,5,6,7,8,9,10])
print(isinstance(obj,Iterable))
while True:
try:
value = next(obj)
print(value)
except StopIteration:
print('迭代成功')
break
class Fibonacci:
'''迭代器类'''
def __init__(self,month):
self.a = 0
self.b = 1
self.month = month
self.n = 0
def __iter__(self):
return self
def __next__(self):
if self.n < self.month:
self.a,self.b = self.b,self.a+self.b
# self.n = self.n +1
self.n += 1
return self.a
else:
raise StopIteration
fi = Fibonacci(5)
print(isinstance(fi,Iterable))
print(isinstance(iter(fi),Iterator))
for i in fi:
print(i)
注意点:
1、iter()方法访问的是迭代器内部的__iter__魔法方法,__iter__这个魔法方法,直接返回迭代器对象本身,也就是self
2、next()方法访问的是迭代器内部的__next__魔法方法,需要记录数据的位置以及抛出数据,所以,抛出数据的逻辑写在当前的方法
3、注意:__next__一定要判断如果数据已经完全取出的时候,要主动抛出错误 raise StopIteration
stopiteration退出迭代器for循环
class MyIterator(object):
#这个类实现的是迭代器类
def __init__(self,newlist):
self.newlist = newlist
#记录的是当前迭代的索引
self.current_index = 0
def __next__(self):
#当前的魔法方法记录遍历的位置,第二个功能是记录需要获取的值
if self.current_index< len(self.newlist):
self.current_index+=1
return self.newlist[self.current_index-1]
else:
raise StopIteration #为了让for循环自动退出
def __iter__(self):
return self
注意点:
raise StopIteration #为了让for循环自动退出,不然不断返回none
最后
以上就是善良白云为你收集整理的迭代器的形成及退出的全部内容,希望文章能够帮你解决迭代器的形成及退出所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复