美文网首页
python学习笔记之--迭代器

python学习笔记之--迭代器

作者: itsenlin | 来源:发表于2021-12-08 00:56 被阅读0次

    前面学习循环时知道,for循环是通过访问可迭代对象来实现循环的,这里详细讨论下迭代器以及可迭代对象相关的内容

    概念

    • 迭代器: 是一种迭代获取元素的工具,不依赖于索引的迭代方式,而是通过next()接口获取下一个元素
    • 可迭代对象:实现了__iter__方法的对象称为可迭代对象;像列表类型对象(list、str、tuple)、字典类对象、集合类对象、文件对象

    注意:迭代过程中不能修改迭代对象,因为迭代过程中记录迭代到的元素位置

    工作原理

    1. 通过iter()接口获取一个迭代器,参数为可迭代对象
    2. 通过next()接口获取下一个迭代元素,参数为上一步获取的迭代器对象
    3. 当迭代结束时会返回一个StopIteration异常
    >>> a = [1, 2, 3, 4, 5]
    >>> it = iter(a)
    >>> next(it)
    1
    >>> next(it)
    2
    >>> next(it)
    3
    >>> next(it)
    4
    >>> next(it)
    5
    >>> next(it)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    >>>
    

    for循环比较智能,可以自动调用iter()next();并且自动捕获StopIteration异常,所以在for循环中不需要主动捕获StopIteration异常

    >>> for item in a:
    ...     print(item, end=' ')
    ... 
    1 2 3 4 5 >>> 
    

    生成器

    python中的关键字yield只能用在函数中,当函数运行到yield语句时会暂停运行,并返回一个生成器对象,而生成器对象本质上也是一个迭代器对象,当调用next()的时候,函数会继续执行后面的代码

    #!/usr/bin/python
    
    def fun():
        a, b = 0, 10
        while b > 0:
            yield a
            a += 1
            b -= 1
    
    it = fun()
    for i in it:
        print(i, end=' ')
    print('')
    

    输出结果为:

    itsenlin@itsenlin-PC:~/Desktop/python_test$ /usr/local/bin/python3.9 /home/itsenlin/Desktop/python_test/helloworld.py
    0 1 2 3 4 5 6 7 8 9 
    itsenlin@itsenlin-PC:~/Desktop/python_test$
    

    自定义迭代器对象

    根据前面讲解,只要实现__iter____next__方法就可以实现一个自定义的迭代器对象,如下(这里参考python3教程章节

    class MyNumbers:
      def __iter__(self):
        self.a = 1
        return self
     
      def __next__(self):
        if self.a <= 20:
          x = self.a
          self.a += 1
          return x
        else:
          raise StopIteration
     
    myclass = MyNumbers()
    myiter = iter(myclass)
     
    for x in myiter:
      print(x)
    

    相关文章

      网友评论

          本文标题:python学习笔记之--迭代器

          本文链接:https://www.haomeiwen.com/subject/ytuzxrtx.html