大多数pythonic方式获得半径范围,并过滤掉太大或太小的条目

dan*_*ast 1 python

我已经实现了这个算法:

def get_hot_pages(self, radius = 2):
    if self.page == None or self.max_pages == None: return []
    hot_pages = []
    for page in xrange(self.page - radius, self.page + radius + 1):
        if page < 0 or page >= self.max_pages : continue
        hot_pages.append(page)
    return hot_pages
Run Code Online (Sandbox Code Playgroud)

但有些事情告诉我,这可以更好地实施.是否有更多的pythonic方式来做到这一点?

Eri*_*got 6

通常的"技巧"是使用max()min()设置最小和最大页码:

def get_hot_pages(self, radius = 2):
    if self.page is None or self.max_pages is None: return []
    return range(max(self.page-radius, 0), min(self.page+radius+1, self.max_pages))
Run Code Online (Sandbox Code Playgroud)

这种方法的主要优点是:

  • 知道此标准过程的人员会立即了解代码的作用(只需要读取一行).无需读取整个循环块(包含过滤器测试)以了解某些页面可能超出范围.
  • 这是有效的:在每次迭代运行的循环内没有测试并过滤掉错误的页码.通常关注效率是很好的(即使这里没关系,在其他情况下也可能很重要):通常情况下,解决方案同时简单,清晰且高效(即,寻求效率)实际上可以使代码更清晰,因为它迫使人们孤立手头问题的本质).