当前位置: 主页 > 日志 > Python >

Python enumerate()函数剖析

PEP 279 -- The enumerate() built-in function(http://www.python.org/dev/peps/pep-0279/)给出了enumerate()的源码如下:

 

def enumerate(collection):

        'Generates an indexed series:  (0,coll[0]), (1,coll[1]) ...'     

        i = 0

        it = iter(collection)

        while 1:

            yield (i, it.next())

            i += 1

 

 

我有个疑问:

 

enumerate内有一个死循环,it.next() 遍历迭代器最终会抛出一个StopIteration异常(红色代码,yield语句)。

但是经过测试发现却没有出现这个异常。

测试代码:

 

for i, v in  enumerate('string'):

    print i, v

 

感觉很奇怪。 于是我猜测是由于yield在捕获到it.next()StopIteration异常后终止了enumerate()生成器。在Pythoner QQ群(103441184)和hzx讨论后,他给出了一段测试代码,更加肯定了我的猜测是正确的。

hzx给出的测试代码:

 

def test3(n):

if n>3:

raise StopIteration;

else:

return n

 

def test():

    i = 0

    while 1:

        yield (i, test3(i))

        i += 1

for i1,i2 in test():

print i1,i2

 

 

最终得出结论:在生成器中yield语句遇到StopItertion异常后会终止生成器。

 

 

 

 

 

[日志信息]

该日志于 2011-04-25 22:20 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “Python enumerate()函数剖析” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部