哪个被认为是更好的设计? (如果检查结果为负,则在收益或检查之前中断,收益率和中断)

时间:2013-05-23 18:06:06

标签: python design-patterns

希望之前没有被问过,其中哪一个被认为更好/更快/更'pythonic'? 检查后休息:

while True:
    #returns either a `page` or None
    p += 1
    page = self.page_has_articles(p) 
    if page:
        yield page
    else:
        break

或首先检查和休息:

while True:
    p += 1
    page = self.page_has_articles(p)
    if not page:
        break
    yield page

2 个答案:

答案 0 :(得分:1)

在给出的(小)例子中,乍一看两者之间没有明显的区别。但是,如果我们早期采用错误的方法提前返回。显然最好先进行break和任何清理。

当使用的代码增加行数时,这变得更加清晰。阅读代码时,比if there is no page, we break更容易记下if there is a page, we do this, and if it isn't, we break

因此,为了便于(更大)代码块的可读性,早期使用break的方法具有优势(在我看来)。

答案 1 :(得分:0)

您可以使用itertools来做脏工而不是滚动自己的循环。

import itertools as it

def enumerate_pages(self,start_p):
    return it.takewhile(bool,it.imap(self.page_has_articles,it.count(start_p,1)))

takewhileimapcount都返回可迭代对象,因此就像你的问题中给出的while循环一样。

it.count(start_p,1)start_p迭代,步长为1.

it.imap()与python 2.x中的map()一样,但返回iterable而不是list

it.takewhile()停止第一个元素的迭代,从给定的谓词函数返回False,在本例中为bool()