协程-生成器

生成器是一种特殊的迭代器。
生成器的几种生成方法
1.将[]变成()

  1 def main():                                                                
  2     nu=[i*2 for i in range(5)]
  3     print(nu)
  4     nu=(i*2 for i in range(5))
  5     print(nu)
  6     
  7     
  8 if __name__=="__main__":
  9     main()
~               

执行结果,明显第二次打印的是一个生成器对象

wy@ubuntu:~/day1$ python3 d.py
[0, 2, 4, 6, 8]
<generator object main.<locals>.<genexpr> at 0x7f5e75aea360>

2.yield.
一个函数中只要有yield语句,那么就不再是函数了,而是一个生成器模板,就相当于迭代器的类一样;在我们调用含有yield的函数时,不是我们理解的调用函数,而是创建一个生成器对象。
==实现过程:==定义的函数里又yield语句时,这个函数不再是函数,而是一个生成器模板,相当于迭代器中的类一样,是类模板,当你调用函数,其实不是调用函数,而是创建生成器对象,里面的参数,传递给定义的"函数"了,但此时函数不会向下执行它里面的内容;定义的obj变量指向生成器对象,执行到for循环时,这时就要引用生成器对象了,从第一句开始向下执行,执行到yield时,此时函数暂停(是暂停而不是结束),将yield的结果给num,打印输出结果,继续执行for循环,此时就不再是从函数开头执行,而是从yield语句的下一句开始执行,while下的语句执行完之后,再次跳到while循环,继续执行while循环的语句,执行到yield语句,函数暂停,将值传递给num,一直这样循环,知道程序结束。

在这里插入图片描述

  1 def creat_num(all_num):
  2     a, b=0, 1
  3     current_num=0
  4     while current_num<all_num:                                             
  5         yield a
  6         a, b=b, a+b
  7         current_num+=1
  8 
  9 obj=creat_num(10)
 10 
 11 for i in obj:
 12     print(i)

执行结果:

wy@ubuntu:~/day1$ python3 d.py
0
1
1
2
3
5
8
13
21
34

为了更好的理解,我们使用next()方法启动生成器

  1 def creat_num(all_num):
  2     a, b=0, 1
  3     current_num=0
  4     while current_num<all_num:
  5         yield
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值