当前位置:  开发笔记 > 编程语言 > 正文

在Python生成器中使用for ... else

如何解决《在Python生成器中使用forelse》经验,为你挑选了2个好方法。

我非常喜欢Python的... else语法 - 令人惊讶的是它的适用频率,以及它如何有效地简化代码.

但是,我还没有想出一个在生成器中使用它的好方法,例如:

def iterate(i):
    for value in i:
        yield value
    else:
        print 'i is empty'

在上面的例子中,我希望print只有在i空的情况下才能执行该语句.然而,无论长度如何,else只有方面breakreturn它总是被执行i.

如果不可能以for...else这种方式使用,那么最好的方法是什么才能使print语句只在没有产生的情况下执行?



1> Triptych..:

你打破了生成器的定义,当迭代完成时它应该抛出一个StopIteration异常(由生成器函数中的return语句自动处理)

所以:

def iterate(i):
    for value in i:
        yield value
    return

最好让调用代码处理空迭代器的情况:

count = 0
for value in iterate(range([])):
    print value
    count += 1
else:
    if count == 0:
        print "list was empty"

可能是一种更干净的方式来做上述事情,但它应该工作正常,并不属于任何常见的"处理下面的陷阱列表陷阱".


返回隐含在发电机的末端.不需要包含它.
+1:"打印我是空的"是别人的问题,而不是发电机的问题.

2> Chris B...:

有几种方法可以做到这一点.你总是可以Iterator直接使用:

def iterate(i):
    try:
        i_iter = iter(i)
        next = i_iter.next()
    except StopIteration:
        print 'i is empty'
        return

    while True:
        yield next
        next = i_iter.next()

但是如果你对这个论点的期望有了更多的了解i,你可以更简洁:

def iterate(i):
    if i:  # or if len(i) == 0
        for next in i:
            yield next
    else:
        print 'i is empty'
        raise StopIteration()

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有