Python中的迭代器和生成器

python中的迭代器和生成器

迭代器

  • 迭代的概念

    • 给定一个列表或者元组,可以通过for循环来遍历这个列表或者元组,我们把这种遍历称为迭代,迭代读取一条数据供我们使用的对象称为可迭代对象
  • 在python中

    • 在类里面定义iter方法创建的对象就是可迭代对象

  class MyIter():
      def __iter__(self):
          pass

在类里面定义iter和next方法创建的对象就是迭代器对象

  class MyIter():
      def __iter__(self):
          pass
      def __next__(self):
          pass

使用迭代器实现

class FibIterator(object):
    """斐波那契数列迭代器"""
    def __init__(self, n):
        """
        :param n: int, 指明生成数列的前n个数
        """
        self.n = n
        # current用来保存当前生成到数列中的第几个数了
        self.current = 0
        # num1用来保存前前一个数,初始值为数列中的第一个数0
        self.num1 = 0
        # num2用来保存前一个数,初始值为数列中的第二个数1
        self.num2 = 1

    def __next__(self):
        """被next()函数调用来获取下一个数"""
        if self.current < self.n:
            num = self.num1
            self.num1, self.num2 = self.num2, self.num1+self.num2
            self.current += 1
            return num
        else:
            raise StopIteration

    def __iter__(self):
        """迭代器的__iter__返回自身即可"""
        return self


if __name__ == '__main__':
    fib = FibIterator(10)
    for num in fib:
        print(num, end=" ")

总结

可迭代对象不一定是迭代器对象
迭代器对象一定是可迭代对象
for循环获取数据创建迭代器对象然后调用next方法
使用迭代器可以大大节省内存空间
生成器
生成器是一类特殊的迭代器,它不需要写普通迭代器的iter和next方法,使用更加方便,它依然可以使用next函数和for循环取值
创建生成器的方法一:
只要把一个列表生成式[]改成(),这样就创建了一个生成器

     (i for i in range(5))

创建生成器的方法二:

  • 只要在def函数中有yield关键字,就称为生成器

          def gen():
             i =0
              while i<5:
                 temp =yield i    
                 print(temp)
                 i+=1

     

  • 我们可以使用for循环遍历生成器

  • 也可以用next方法取值

  • 还可以调用send方法给yield传值

  • yield生成斐波那契数列

       def fibonacci(num):
       # 初始化第一个值和第二个值
           a =0
           b =1
           # 记录生成fibonacci数字的下标
           current_index =0
           while current_index < num:
               result = a
               a, b = b, a + b
               current_index +=1
               # 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
               yield result
       
       for i in fibonacci(5):
           print(i)

    yield和return的对比
    使用了yield关键字的函数不再是函数,而是生成器
    代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
    每次启动生成器都会返回一个值,多次启动可以返回多个值。
    return只能返回一次值,代码执行到return会停止迭代,抛出停止迭代异常
    yield可以在下次执行的时候接受传递的值

http://mseo.chinaz.com/lvyoup1.nx04.com/   http://seo.chinaz.com/lvyoup2.nx04.com/     http://mseo.chinaz.com/lvyoup3.nx04.com/   http://seo.chinaz.com/lvyoup4.nx04.com/ 

http://mseo.chinaz.com/lvyou5.nx04.com/   http://seo.chinaz.com/lvyoup6.nx04.com/     http://mseo.chinaz.com/lvyoup7.nx04.com/   http://seo.chinaz.com/lvyoup8.nx04.com/

 

posted @ 2020-01-06 20:58  胡马  阅读(513)  评论(0编辑  收藏  举报