python之三大法器——生成器

python之三大法器——生成器,第1张

python之三大法器——生成器

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

  • 创建生成器的方法一:

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

    • >>> (i for i in range(0,5))
       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循环遍历生成器

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5496189.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存