希望之前没有被问过,其中哪一个被认为更好/更快/更'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
答案 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)))
takewhile
,imap
和count
都返回可迭代对象,因此就像你的问题中给出的while循环一样。
it.count(start_p,1)
从start_p
迭代,步长为1.
it.imap()
与python 2.x中的map()
一样,但返回iterable
而不是list
。
it.takewhile()
停止第一个元素的迭代,从给定的谓词函数返回False
,在本例中为bool()