(1)生成器:凡是调用yeild的函数,都称为生成器
print('begin')
while n>2:
yeild n*2 #yeild 后面是什么,就生成怎样的生成器
n=n-1
>>>x=count2(5) #生成一组序列
#调用的时候是一步一步调用,碰到yeild 就停止执行,等待下次
>>>x.__next__() #输出结果序列的第一个值
begin
10
>>>x.__next__() #输出结果序列的第二个值
8
>>>x.__next__() #输出结果序列的第三个值
6
>>>x.__next__() #出现错误,生成器输出结束
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
x.__next__()
StopIteration
>>>for i in count2(5): #可以使用循环的方式输出生成器的序列,这样就不会抛出异常
print(i)
>>>begin
10 8 6
(2)把创建列表的'[ ]'改为'( )'即可实现简单的创建
>>>g=(x for x in range(1,10)) #简单创建生成器
>>>g
>>> <generator object <genexpr> at 0x040E32D0>
>>>g.__next__()
>>>1 #也可以使用next()函数输出结果
(3)生成器有很大的用途:可以用作协程,可以使用send()函数传送信息,实现命令的执行
例如:
#可以写一个字符串查找的函数
>>> def print_matches(matchtext):
print('looking for ',matchtext)
while True:
line=(yield)
if matchtext in line:
print(line)
>>> m=print_matches("python")
>>> m.__next__()
>>>looking for python
>>> m.send('pytho n is cool ')
>>> m.send('python is fun')
python is fun
>>>m.close() #关闭生成器
生成器不会把结果保存在一个系列中,而是保存生成器的状态,
在每次进行迭代时返回一个值,直到遇到StopIteration异常结束。
在一个生成器中,如果没有return,则默认执行到函数完毕时返回StopIteration;
如果遇到return,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。