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

  • 相关阅读:
    UOJ299 游戏
    SPOJ-DivCnt2 Counting Divisors (square)
    Gym102331B Bitwise Xor
    POJ3495 Bitwise XOR of Arithmetic Progression
    LG5325 【模板】Min_25筛
    LOJ6229 这是一道简单的数学题
    BZOJ3601 一个人的数论
    LOJ138 类欧几里得算法
    Atcoder TypicalDPContest N~T
    莫队基础题
  • 原文地址:https://www.cnblogs.com/zx125/p/11614062.html
Copyright © 2011-2022 走看看