zoukankan      html  css  js  c++  java
  • 迭代器

    参考博客:http://python.jobbole.com/81916/

    可以直接作用于for循环的对象统称位可迭代对象(iterable).

    可以被next()函数调用并不断返回下一个值的对象成为迭代器(iterator)。

    所有的lterable均可以通过内置函数iter()来转化为iterator().

    对迭代器来讲,有一个_next()就够了。在使用for和in语句的时候,程序就会自动调用即将被处理的对象的迭代器对象。然后使用它的next()方法,直到监测到一个Stopiteration异常。

    >>> l = [1,2,3,4]
    >>> L = iter(l)
    >>> next(I)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'I' is not defined
    >>> next(L)
    1
    >>> next(L)
    2
    >>> next(L)
    3
    >>> next(L)
    4
    >>> next(L)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration

    上面例子中,列表I可以被for进行循环,但是不能被内置函数next()用来查找下一个值,所以I是iterable。

    I通过iter进行包装后为L,L可以被next()用来查找下一个值,所以L是iterable。

    for循环内部事实上就是先调用iter()把iterable变成iterator再进行循环迭代。

    iterator继承自iterable,iterator包含__iter()和next()方法,而iterable仅仅包含iter__().

    iterable需要包含有__iter()方法用来返回iterator,而iterator需要包含有next__()方法用来被循环。

    如果我们自己定义迭代器,只要在类里面定义一个iter()函数,用它来返回一个带next()方法的对象就够了。

    class Iterable:
        def __iter__(self):   
            return Iterator()  #转换成迭代器
    class Iterator:
        def __init__(self):
            self.start = -1
        def __next__(self):
            self.start +=2
            if self.start > 10:
                raise StopIteration
            return self.start
    
    I = Iterable()
    for i in I:
        print(i)
    
    结果:
    1
    3
    5
    7
    9

    上面的代码实现的是找到10以内的奇数,代码中的类名可以随便取。

    如果在Iterator的__next__方法中没有实现Stoplteration异常,那么则是表示的全部为奇数,那么需要在调用的时候设置退出循环的条件。我们通过range来实现打印多少个元素,这里表示打印5个元素,返回的结果和上面一致。

    class Iterable:
        def __iter__(self):
            return Iterator()
    class Iterator:
        def __init__(self):
            self.start = -1
        def __next__(self):
            self.start +=2
            return self.start
    
    I = Iterable()
    for count,i in zip(range(5),I):
        print(i)

    可以把这两个合并在一起

    class Iterable:
        def __iter__(self):   #直接改变类型,传递到原来的参数上面
            return self
        def __init__(self):
            self.start = -1
        def __next__(self):
            self.start +=2
            if self.start > 10:
                raise StopIteration
            return self.start
    
    I = Iterable()
    for i in I:
        print(i)

    注意:迭代器不能向后移动,不能回到开始。

  • 相关阅读:
    BNU 51002 BQG's Complexity Analysis
    BNU OJ 51003 BQG's Confusing Sequence
    BNU OJ 51000 BQG's Random String
    BNU OJ 50999 BQG's Approaching Deadline
    BNU OJ 50998 BQG's Messy Code
    BNU OJ 50997 BQG's Programming Contest
    CodeForces 609D Gadgets for dollars and pounds
    CodeForces 609C Load Balancing
    CodeForces 609B The Best Gift
    CodeForces 609A USB Flash Drives
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7773240.html
Copyright © 2011-2022 走看看