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

与えられた(小さな)例では、一見すると2つの間に明確な違いはありません。ただし、エラーのアプローチを早期に取るか、早期に返すと. breakおよびすべてのクリーンアップを最初に実行する方が明らかに優れています。

これは、使用されるコードの行数が増えるとさらに明確になります。コードを読むときはif there is no page, we breakif there is a page, we do this, and if it isn't, we break.

そのため、コードの (より大きな) ブロックを読みやすくするために、break早い段階で使用するアプローチには利点があります (私の意見では)。

于 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)))

takewhileimap、およびすべてが反復可能countなオブジェクトを返すため、質問の例として与えられた while ループと同じように機能します。

it.count(start_p,1)start_pからステップ 1 で反復します。

it.imap()map()Python 2.x と同じように動作しますが、 のiterable代わりに を返しますlist

it.takewhile()指定された述語関数から返される最初の要素で反復を停止しますFalse。この場合はbool()

于 2013-05-23T19:07:10.557 に答える