• Python可迭代的对象与迭代器的对比


    什么是迭代?迭代是指按需一次获取一个数据。是否可以迭代,可以通过是否可以使用for循环取值来进行简单的判断。更准确的判断是使用iter()函数,这是一个Python内置函数。

    可迭代的对象

    iter()函数的作用如下:

    1. 如果对象实现了__iter__方法,那么就调用它,获取一个迭代器。比如:

      def __iter__(self):
          return SentenceIterator(self.words)
      
    2. 如果对象没有实现__iter__但是实现了__getitem__方法,那么就创建一个迭代器,尝试从索引0开始获取元素。

    3. 如果尝试获取元素失败,就会抛出TypeError异常。

    可迭代的对象,就是使用iter()函数判断,满足前面2点的对象。

    任何Python序列都是可以迭代的,因为它们都实现了__getitem__方法。

    迭代器

    从前面iter()函数的作用可以发现,迭代器是从可迭代的对象中获取的

    1. 如果对象本身是可迭代的,就调用__iter__方法获取一个迭代器。
    2. 如果对象不可迭代但是实现了__getitem__方法,那么就会创建一个迭代器。

    比如可以使用iter()函数把列表转换为迭代器:

    >>> test_list = [1, 2, 3]
    >>> print(type(test_list))
    <class 'list'>
    
    >>> test_iter = iter(test_list)
    >>> print(type(test_iter))
    <class 'list_iterator'>
    

    迭代器可以使用for循环遍历:

    for x in test_iter:
        print(x)
    

    也可以使用while循环遍历:

    while True:
        try:
            print(next(test_iter))
        except StopIteration:
            del test_iter
            break
    
    • next()函数用于获取迭代器下一个元素。
    • 没有元素了,迭代器会抛出StopIteration异常。

    标准的迭代器接口有两个方法:

    • __next__返回下一个元素。

    • __iter__返回self,以便在应该使用可迭代对象的地方使用迭代器,比如for循环中。

      def __iter__(self):
          return self
      

    迭代器的准确定义是:迭代器是这样的对象,它实现了无参数的__next__方法,返回序列中的下一个元素;如果没有元素了,那么抛出StopIteration异常。Python中的迭代器还实现了__iter__方法,因此迭代器也是可以迭代的。

    最后,通过对比可以发现,可迭代对象__iter__返回的是迭代器:

    def __iter__(self):
        return SentenceIterator(self.words)
    

    迭代器__iter__返回的是self:

    class SentenceIterator:
        def __iter__(self):
            return self
    

    而且迭代器还需要有__next__方法。

    从这一点就能清楚看出它们的区别了。

    需要特别注意的是,可迭代的对象一定不能是自身的迭代器,也就是说,可迭代对象必须实现__iter__方法,但是不能实现__next__方法。否则会让设计模式变得混乱不堪。

    参考资料:

    《流畅的Python》第14章 可迭代的对象、迭代器和生成器

    https://www.runoob.com/python3/python3-iterator-generator.html

  • 相关阅读:
    从HDFS下载文件到本地
    oracle jdbc jar包异常
    spring jdbctemplate 启动报错(oracle驱动bug)
    solr搜索异常
    jdbc 处理Clob
    Wavosaur音频编辑软件: 功能专业,体积超小(500KB)
    isa server 2004中找不到HTTP过滤选项。
    cisco pix logging facility含义
    IPSec基础-密钥交换和密钥保护
    cisco 831 使用 SDM
  • 原文地址:https://www.cnblogs.com/df888/p/15612478.html
Copyright © 2020-2023  润新知