美文网首页
【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