python之三大法器——生成器

  • 生成器是一类特殊的迭代器,它不需要再像上面的类一样写iter()和next()方法了, 使用更加方便,它依然可以使用next函数和for循环取值

  • 创建生成器的方法一:

    • 只要把一个列表生成式的[]改成(),就创建了一个生成器

    • >>> (i for i in range(0,5))
      <generator object <genexpr> at 0x102c38360>
    • 我们可以看到他的类型是genexpr

  • 创建生成器的方法二:

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

    • def gen():
         i =0
         while i<5:
              temp = yield i    
              print(temp)
              i+=1
    • g = gen()
      for i in g:
        pring(i)
    • next(f)
    • f = gen()
      next(f)   #首次调用必须是next,因为生成器还没有执行到yield 无法进行接收值
      f.send('haha')   #send 发送值 传递给生成器 由temp进行接收
      next(f)   #再次调用next  相当于send了一个None
      f.send('haha')
    • 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的函数就是生成器)

      • 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行

      • 每次启动生成器都会返回一个值,多次启动可以返回多个值,也就是yield可以返回多个值

      • return只能返回一次值,代码执行到return语句就停止迭代,抛出停止迭代异常

      • yield可以在下次执行的时候接受传递的值

  • yield的使用生成菲波那切数列:

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

  • 我们也可以使用next方法取值

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

学IT,上博学谷

博学谷

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值