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