for源码实现

for源码实现

我们知道,java的while和for基本上是实现一样的功能,这样会不会有一点缺点,同时java的迭代器显得尤为的麻烦。

python的for和while就不同了,在实现迭代的功能的情况下,还能对每一个迭代出来的数据进行处理。

for可以迭代三种对象

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__()返回的则是本身,之前迭代到哪个位置,接下来还是从哪里继续迭代

posted @ 2019-09-30 20:14  zx125  阅读(672)  评论(0编辑  收藏  举报