标签:数据 ble 基本 pytho next tor __iter__ turn 手动
我们知道,java的while和for基本上是实现一样的功能,这样会不会有一点缺点,同时java的迭代器显得尤为的麻烦。
python的for和while就不同了,在实现迭代的功能的情况下,还能对每一个迭代出来的数据进行处理。
1.默认有__iter__()
的对象,也就是可迭代对象
class zx:
def __init__(self):
self.ls = [1,2,3,4]
def __iter__(self):
for i in self.ls:
yield i
z=zx()
for i in z:
print(i)
2.默认有__iter__()和__next__()
,也就是迭代器对象
class zx:
def __init__(self):
self.ls = [1,2,3,4]
self.i = -1
def __iter__(self):
return self
def __next__(self):
if self.i < self.ls.__len__()-1:
self.i+=1
return self.ls[self.i]
else:
raise StopIteration
z=zx()
for i in z:
print(i)
3.默认有__getitems__()
class zx:
def __init__(self):
self.ls = [1,2,3,4]
def __getitem__(self, item):
return self.ls[item]
z=zx()
for i in z:
print(i)
1.不知道你是否有这样的一个疑问,为啥迭代器对象和可迭代对象都有一个__iter__()
的方法,其实这就和for的实现有关
2.我们知道我们手动__next__()
,当没有迭代的数据的时候,会报一个StopIteration
,为啥用了for就不会出现了,其实for已经帮我们捕获和处理了这个异常
1)for....in iterable,首先调用iter(iterable)函数,返回一个迭代器iterator
2)每次循环,调用一次对象的__next__(self)
,直到最后一个值,再次调用会触发StopIteration
3)for循环捕捉到StopIteration,从而结束循环
1要注意一点,可迭代对象调用__iter__()
相当于创建了一个新的迭代器对象,从最开始迭代,而迭代器对象调用__iter__()
返回的则是本身,之前迭代到哪个位置,接下来还是从哪里继续迭代
标签:数据 ble 基本 pytho next tor __iter__ turn 手动
原文地址:https://www.cnblogs.com/zx125/p/11614062.html