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可以在下次执行的时候接受传递的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值