<>生成器

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

技术
下载桌面版
GitHub
Microsoft Store
SourceForge
夸克网盘
百度网盘
云服务器优惠
华为云优惠券
京东云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信