• python(九)迭代器和生成器


    一、迭代

          迭代就是逐个并且单向访问容器 (这里的容器暂时指数据类型,比如list和dict) 中的元素的行为。举个例子:将一个长度为五的数组逐个从头到尾(即单向)打印的方式称之为迭代。如下图。

    >>> list = [1,2,3,4,5]
    >>> for i in list:
    ...     print i 
    ... 
    1
    2
    3
    4
    5

    二、迭代器

         1、迭代器概念

             迭代器简单的说就是可以对数据(这里指可以迭代的数据)进行迭代行为的对象。

             可以通过以下两个方面描述迭代器[4]

                   1)、iter 返回的是迭代器对象本身。用在for 和 in 上面。

                   2)、每次调用next() 方法返回迭代器的下一个元素,当没有元素可以返回就会抛出异常; 

             迭代器可以理解为可以逐个并单向访问容器中元素的游标。

             而迭代器对象只能迭代一次,也就是返回最后的值后,再继续访问,只会返回异常。

             下面举个例子(2):

    >>> list = [1,2,3,4,5]
    >>> iterator = iter(list)
    >>> iterator.next()
    1
    >>> iterator.next()
    2
    >>> iterator.next()
    3
    >>> iterator.next()
    4
    >>> iterator.next()
    5
    >>> iterator.next()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration

          2、迭代器的实现[4]:

              接下通过定义一个迭代器来实现迭代功能, 这个是官方文档的例子[4]:

              先定义(个人觉得这个例子不合适,有个更好的找不到,自己也暂时想不出)

    class Counter(object):
        def __init__(self, low, high):
            self.current = low
            self.high = high
    
        def iter(self):
            'Returns itself as an iterator object'
            return self
    
        def next(self):
            'Returns the next value till current is lower than high'
            if self.current > self.high:
                raise StopIteration
            else:
                self.current += 1
                return self.current - 1

         再实现   

    test1 = Counter(1,3).iter()
    print "test1"
    print next(test1)
    print next(test1)
    print next(test1)
    
    
    test2 = Counter(1,3)
    print "test2"
    print next(test2)
    print next(test2)
    print next(test2)
    print next(test2)

       这是输出

    #test1 的输出
    test1
    1
    2
    3 #test2 的输出 test2 1 2
    3 StopIteration

         注意test2的next调用超过里面的元素就会抛出异常

      

    三、生成器

          生成器也是迭代器,但比迭代器多了一个关键字yeild. 这个yield功能替代了迭代器的iter 和 next 功能。

          我在参考的时候看到一个概况的很好的说法。

          “yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象(转自[2], 作者:廖雪峰)”

          举个例子(3),先定义一个生成器

    def counter_generator(low, high):
        while low <= high:
           yield low
           low += 1

         实现

    i= counter_generator(1, 3)
    print(i.next())
    print(i.next())
    print(i.next())
    print(i.next())

        输出

    1
    2
    3
    StopIteration

         

         再举个例子(4),先定义一个生成器

    >>>  def fab(max):
    ...         n, a, b = 0, 0, 1
    ...         while n < max:
    ...            yield b
    ...            a, b = b, a + b
    ...            n = n + 1
    >>>  f = fab(5)
    >>>  print f.next() #这里返回的值可以当做 'b' 的值
    1
    >>>  print f.next()
    1
    >>>  print f.next()
    2
    >>>  print f.next()
    3
    >>>  print f.next()
    5
    >>>  print f.next()
    StopIteration

        


    参考:   

    [1] Python中iteration(迭代)、iterator(迭代器)、generator(生成器)等相关概念的理解[2]:
    http://blog.csdn.net/dawningblue/article/details/72629362

    [2] Python yield 使用浅析
    https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

    [3] Iterator - Python Wiki
    https://wiki.python.org/moin/Iterator

    [4] python官方文档定义

    https://pymbook.readthedocs.io/en/latest/igd.html

          

  • 相关阅读:
    Python数据可视化---pygal模块
    Linux常用命令---常用的用户,解压,网络,关机命令
    Python实战---制作专属有声小说(调用百度语音合成接口)
    Linux基本操作---文件搜索命令
    MySQL必知必会1-20章读书笔记
    这是反馈的地方呀
    设计模式--建造者模式
    python 弹窗提示警告框MessageBox
    算法分析设计--递归算法
    Web程序开发最基本的编程模式--MVC编程模式
  • 原文地址:https://www.cnblogs.com/Jomini/p/8563614.html
Copyright © 2020-2023  润新知