是否有一种优雅的方法可以防止我的程序跳过十年?

时间:2011-10-04 17:31:53

标签: language-agnostic loops

我正在编写一个网络抓取工具,可以从维基百科的十年文章中获取内容。 (例如10s1970s1670s BC等文章。)

我正在使用类似于此的逻辑来抓取页面。

for (i = -1690; i <= 2010; i += 10)
    if (i < 0)
        page = (-i) + "s_BC"
    else
        page = i + "s"
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + page)

这是有效的,除了我没有考虑的一个小细节。

问题是有两个0年。有一个0s AD和一个0s BC。通过我的循环当前的工作方式,程序只从0s AD页面抓取内容。

这是一个非常简单的问题,但我很难想出一个非常好的修复方法。我知道我可以将循环的主体提取到一个单独的函数并使用两个单独的循环,但我觉得有一种更优雅的方法可以做到这一点,我不知道。

如何在不引入太多复杂性的情况下解决此问题?

4 个答案:

答案 0 :(得分:1)

你介意沿途点击几个404页面吗?

for (i = 0; i <= 2010; i+=10)
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + i + "s")
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + i + "s_BC")
end

如果对这个问题的回答是“是的,我在意”那么你仍然可以投入一些if

for (i = 0; i <= 2010; i+=10)
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + i + "s")
    if (i < 1690)
        GrabContentFromURL("http://en.wikipedia.org/wiki/" + i + "s_BC")
end

答案 1 :(得分:1)

如果您只想要一个函数调用,那么如下所示:

for (int i = -1695; i <= 2015; i += 10)
    if (i < 0)
        page = (- (i + 5)) + "s_BC";
    else
        page = (i - 5) + "s";
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + page)

答案 2 :(得分:1)

i = 0从未运行“BC分支”时,存在一个逻辑问题。我会改变它:

for (i = -1690; i <= 2010; i+= 10)
    if (i <= 0) // includes zero so will run for 0 BC
      processDecade((-i) + "s_BC")
    if (i >= 0) // not else-if so will match 0 AD after 0 BC (above)
      processDecade(i + "s")

function processDecade (page)
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + page)

另一种方法是使用两个循环,一个来自[-1960, 0] by 10(或[1960, 0] by -10),然后来自[0, 2010] by 10。 (对于具有良好序列支持的语言,这在一个循环中是一个doozey。)

快乐的编码。

答案 3 :(得分:0)

在Python中,也可以翻译成CoffeeScript

for i, sign in [(j * 10, -1) for j in range(197)] +\
               [(j * 10, 1) for j in range(202)]: # range(N) is going from 0 to N-1
    grab_url "%d%s" % (i, "s_BC" if sign < 0 else "s")