<>生成器
对象后续元素按照某种算法推算出来,在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块砖!