我们将通过列表迭代器和xrange等简单实用的示例来学习Python迭代和迭代器的重要概念。遍历对象、物理或虚拟存储序列。列表、元组、字符串、字典、集合和生成器对象是可迭代的,但整数是不可迭代的。如果你不确定哪个是可迭代的,哪个不是,你需要使用python的内置iter()来帮助。>>>iter([1,2,3])>>>iter({1:2,2:4})>>>iter(1234)Traceback(mostrecentcallast):文件”",line1,initer(1234)TypeError:'int'objectisnotiterableiter()为列表返回一个列表迭代器对象,为字典返回一个字典键迭代器对象。对于其他可迭代类型,迭代器对象的返回方式类似。当iter()用于自定义类型时会发生什么?我们先定义一个String类:classString(object):def__init__(self,val):self.val=valdef__str__(self):returnsself.valst=String('samplestring')那么,st是可迭代的吗?>>>iter(st)TypeError:'String'objectisnotiterable你可能有几个问题要问:如何使自定义类型可迭代?iter()到底做了什么?让我们添加String类来寻找答案valispythonstringsoiter()willreturn'siterator>>>st=String('SampleString')>>>iter(st)Thisis__iter__methodofStringclass在String类中,需要一个'__iter__'方法使String类型可迭代,这意味着“iter”在内部调用“iterable.__iter__()”。别担心,这不是添加'__iter()'方法的唯一方法.val[index]>>>st=String('SampleString')>>iter(st)'itr'也会调用'iterable.__getitem__()',所以我们使用'__getitem__'方法使String类型可迭代如果你在String类同时存在'和'__getitem__()',只有'__iter__'会起作用。自动迭代for循环会自动迭代forxiniterable:printx不使用for循环可以吗?definerate_while(iterable):index=0while(i>>simulate_for_loop([23,12,34,56])23123456我们之前看过iterable类,我们知道iter会返回一个iterator目的。现在我们尝试了解迭代器类的设计。classIterator:def__init__(self,iterable)self.iterable=iterable..def__iter__(self):#itershouldreturnsselfifcalledoniteratorreturnsselfdefnext(self):#Use__next__()inpython3.xifcondition:#itshouldraiseStopIterationexceptionifnonextelementislefttoreturnra没有比这更深的会在.但在这里我们出于学习目的。...列表迭代器你可能会在面试中写这个,所以打起精神注意classlist_iter(object):def__init__(self,list_data):self.list_data=list_dataself.index=0def__iter__(self):returnsselfdefnext(self):#Use__next__inpython3.xifself。index>>ls=List([1,2,34])>>>it=iter(ls)>>>next(it)1>>>next(it)2>>>next(it)34>>>next(it)Traceback(mostrecentcalllast):File"",line1,innext(it)File"”,第13行,innextraiseStopIteration()StopIterationxrange以一个问题开始——xrange是迭代还是迭代器?我们来看看>>>x=xrange(10)>>>type(x)的几个关键点:1.应该支持`iter(xrange(num))`2.如果`iter(xrange(num))`返回相同的对象(xrange类型),那么xrange就是迭代器3.如果`iter(xrange(num))`返回一个迭代器对象,那么xrange就是迭代>>>iter(xrange(10))返回的是rangeiterator,所以我们可以称它为迭代器让我们用最少的xrange函数实现自己的xrangexrange_iterator类xrange_iter(object):def__init__(self,num):self.num=numself.start=0def__iter__(self):returnsselfdefnext(self):ifself.start>>forxinmy_xrange(10):printx,0123456789我喜欢在这里总结一下文章,欢迎评论和提问。翻译链接:http://www.codeceo.com/article/python-iterable-and-iterator.html英文原文:Python:IterableandIterator