python 生成器

来源:互联网 发布:熊猫看书软件下载 编辑:程序博客网 时间:2024/06/05 13:35

(1)生成器:凡是调用yeild的函数,都称为生成器


>>>def count2(n):
    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 终止迭代。
原创粉丝点击