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块砖!

你可能感兴趣的:(Python,python)