python 生成器

生成器

对象后续元素按照某种算法推算出来,在python中,这种一边循环一边计算的机制,称为生成器。
得到生成器的方法
1、利用列表推导式得到。

cat generator.py 
#!/usr/bin/env python
#coding:utf8
g=(x*3 for x in range(10))
print(type(g))
python3 generator.py 
<type 'generator'>

函数生成器

python函数中有yield关键字,函数就变成了生成器。

#!/usr/bin/env python3
#coding:utf8
def fun():
   n=0
   while True:
      n+=1
      yield n

g=fun()
print(type(g))
print(next(g))
python3 g.py 
<class 'generator'>
1

案例

使用函数生成器打印斐波那契数列。

cat fib.py 
#!/usr/bin/env python3
#coding:utf8
def fib(length):
   a,b = 0,1
   n=0
   while n<length:
      yield b
      a,b = b,a+b
      n+=1
   return '没有更多的元素了'
g=fib(8)
print(type(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
python3 fib.py 
<class 'generator'>
1
1
2
3
5
8
13
21
Traceback (most recent call last):
  File "fib.py", line 21, in <module>
    print(next(g))
StopIteration: 没有更多的元素了

生成器之send方法

cat gen.py 
#!/usr/bin/env python3
#coding:utf8
def gen():
   i=0
   while i<5:
      temp=yield i
      print('temp:',temp)
      i+=1
   return '没有更多的元素'
g=gen()
print(g.send(None))
n1=g.send('起点')
print('n1',n1)
n2=g.send('发展')
print('n2',n2)
python3 gen.py 
0
temp: 起点
n1 1
temp: 发展
n2 2

生成器之应用多任务

cat task.py 
#!/usr/bin/env python3
#coding:utf8
def task1(n):
   for i in range(n):
      print('正在搬第{}块砖!'.format(i))

def task2(n):
   for i in range(n):
      print('正在听第{}首歌!'.format(i))


task1(10)
task2(5)

执行

python3 task.py 
正在搬第0块砖!
正在搬第1块砖!
正在搬第2块砖!
正在搬第3块砖!
正在搬第4块砖!
正在搬第5块砖!
正在搬第6块砖!
正在搬第7块砖!
正在搬第8块砖!
正在搬第9块砖!
正在听第0首歌!
正在听第1首歌!
正在听第2首歌!
正在听第3首歌!
正在听第4首歌!

可以看到,任务并不是交替执行的(非多任务),而是先执行完一个任务,再执行下一个任务。
现在用生成器来变成多任务执行。

cat task.py 
#!/usr/bin/env python3
#coding:utf8
def task1(n):
   for i in range(n):
      print('正在搬第{}块砖!'.format(i))
      yield None
def task2(n):
   for i in range(n):
      print('正在听第{}首歌!'.format(i))
      yield None

g1=task1(10)
g2=task2(5)
while True:
   g1.__next__()
   g2.__next__()

执行

python3 task.py 
正在搬第0块砖!
正在听第0首歌!
正在搬第1块砖!
正在听第1首歌!
正在搬第2块砖!
正在听第2首歌!
正在搬第3块砖!
正在听第3首歌!
正在搬第4块砖!
正在听第4首歌!
正在搬第5块砖!
Traceback (most recent call last):
  File "task.py", line 16, in <module>
    g2.__next__()
StopIteration

报错用异常捕捉处理一下

cat task.py 
#!/usr/bin/env python3
#coding:utf8
def task1(n):
   for i in range(n):
      print('正在搬第{}块砖!'.format(i))
      yield None
def task2(n):
   for i in range(n):
      print('正在听第{}首歌!'.format(i))
      yield None

g1=task1(10)
g2=task2(5)
while True:
   try:
      g1.__next__()
      g2.__next__()
   except:
      pass
python3 task.py 
正在搬第0块砖!
正在听第0首歌!
正在搬第1块砖!
正在听第1首歌!
正在搬第2块砖!
正在听第2首歌!
正在搬第3块砖!
正在听第3首歌!
正在搬第4块砖!
正在听第4首歌!
正在搬第5块砖!
正在搬第6块砖!
正在搬第7块砖!
正在搬第8块砖!
正在搬第9块砖!
  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空无限

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值