码迷,mamicode.com
首页 > 其他好文 > 详细

for源码实现

时间:2019-09-30 21:50:50      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:数据   ble   基本   pytho   next   tor   __iter__   turn   手动   

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

for源码实现

标签:数据   ble   基本   pytho   next   tor   __iter__   turn   手动   

原文地址:https://www.cnblogs.com/zx125/p/11614062.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!