Python中的迭代器和生成器

python中的迭代器和生成器

迭代器

  • 迭代的概念python

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

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

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

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

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

使用迭代器实现code

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循环取值
建立生成器的方法一:
只要把一个列表生成式[]改为(),这样就建立了一个生成器blog

     (i for i in range(5))

建立生成器的方法二:seo

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

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

     

  • 咱们能够使用for循环遍历生成器ci

  • 也能够用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/

相关文章
相关标签/搜索