0

希望以前没有被问过,其中哪一个被认为更好/更快/更“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
4

2 回答 2

1

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

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

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

于 2013-05-23T18:37:44.790 回答
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)))

takewhile, imap, 并且count都返回可迭代对象,因此将与您在问题中给出的 while 循环一样工作。

it.count(start_p,1)start_p以 1 的步长迭代。

it.imap()执行起来就像map()在 python 2.x 中一样,但返回的iterable是 a 而不是 a list

it.takewhile()在第一个元素处停止迭代以False从给定的谓词函数返回,在这种情况下是bool()

于 2013-05-23T19:07:10.557 回答