美文网首页
【2017-09-20】迭代器与生成器(一)

【2017-09-20】迭代器与生成器(一)

作者: 小蜗牛的成长 | 来源:发表于2017-09-20 14:13 被阅读0次

    迭代器(iterator)与生成器(generator)

    • 迭代器
        迭代器:它是一个带状态的对象,调用next()方法的时候返回容器中的下一个值,任何实现了iternext()(python2中实现next())方法的对象都是迭代器,iter返回迭代器自身,next返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常。
         容器:把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这些数据结构直接把所有元素存放在内存中。
         可迭代对象(iterable):但凡是可以返回一个迭代器的对象都可称之为可迭代对象。例如内置的list、dict、set等数据结构属于可迭代对象。
         实现一个迭代器的方法
      • 为容器对象添加 iter() 和 next() 方法(Python 2.7 中是 next());iter() 返回迭代器对象本身 self,next() 则返回每次调用 next() 或迭代时的元素;
      • 内置函数 iter() 将可迭代对象转化为迭代器
      • 生成器(generator)。特殊的迭代器,生成器通过 yield 语句(即通过 yield 语句将普通函数变成生成器)快速生成迭代器,省略了复杂的 iter() & next() 方式。
    #简单示例
    >>> list1=[1,2,3,4]
    >>> list_iterator=iter(list1)
    >>> list1
    [1, 2, 3, 4]
    >>> list_iterator
    <list_iterator object at 0x0227B7F0>
    >>> next(list_iterator)
    1
    >>> next(list_iterator)
    2
    >>> next(list_iterator)
    3
    >>> next(list_iterator)
    4
    >>> next(list_iterator)
    Traceback (most recent call last):
      File "<pyshell#13>", line 1, in <module>
        next(list_iterator)
    StopIteration
    >>> 
    

    示例2:自定义迭代器:实现斐波那契数列
    在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

    >>> from itertools import islice
    >>> class Fibonacci:
        def __init__(self):
            self.f0=0
            self.f1=1
        def __iter__(self):
            return self
        def __next__(self):
            value=self.f1
            self.f1+=self.f0
            self.f0=value
            return value
    
        
    >>> f = Fibonacci()
    >>> list(islice(f, 0, 10))
    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
    >>> 
    

    示例3:用生成器的方式实现斐波那契数列

    >>> def Fibonacci():
        f0,f1=0,1
        while True:
            yield f1
            f0,f1=f1,f0+f1
    >>> f = Fibonacci()
    >>> list(islice(f, 0, 10))
    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
    >>> 
    

      迭代器不会预先将所有元素加载在内存中,只有当它被调用时,才会真正返回值

    相关文章

      网友评论

          本文标题:【2017-09-20】迭代器与生成器(一)

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