2

我不确定我是否正确地用了标题,但我想做的是找到 xrange() 正在传递的值的总和。

理想情况下,它看起来像这样:(注意,这不是工作代码)

mofthree = xrange(2, 1000, 3)
moffive = xrange(4, 996, 5)

print mofthree + moffive

但是,当然,您不能将两个函数加在一起。我也可以做一些事情,例如将所有值添加mofthree在一起,将结果存储在一个新变量中,然后对两个新变量做同样的事情并将moffive两个新变量加在一起。

但是,我根本不知道如何将这些值加在一起。

4

3 回答 3

6
mofthree = xrange(2, 1000, 3)
moffive = xrange(4, 996, 5)

print sum(mofthree) + sum(moffive)

或使用 itertools 和chain

from itertools import chain
mofthree = xrange(2, 1000, 3)
moffive = xrange(4, 996, 5)

print sum(chain(moffive, mofthree))
于 2012-07-26T03:35:20.420 回答
3

您可以使用sum()

>>> sum(xrange(2, 1000, 3))
166500
>>> sum(xrange(4, 996, 5))
99301
于 2012-07-26T03:35:03.763 回答
0

您可以使用算术级数之和的公式,而不是遍历范围中的每个项目并将它们相加,如下所示:

def sum_range(*args):
    # parse the arguments, using the same positional notation as range()
    lo,hi,step = [
        lambda args: (0,       args[0], 1),
        lambda args: (args[0], args[1], 1),
        lambda args: args
    ][len(args)-1](args)

    # make sure we handle negative steps properly
    flip_sign = (step < 0)
    if flip_sign:
        lo,hi,step = -lo,-hi,-step

    # and do the actual calculation
    items = (hi - lo + step - 1) // step
    if items <= 0:
        return 0
    else:
        total = (2*lo + (items-1)*step) * items // 2
        return -total if flip_sign else total

然后你可以像使用它一样

print sum_range(2, 1000, 3) + sum_range(4, 996, 5)

出于兴趣,我对 Frédéric Hamidi 的回答进行了比较时间:

算法运行时图

其中 x 轴是范围内的项目数,y 轴是运行时间,我的算法是绿色的,他的算法是蓝色的。正如预期的那样,他的算法的运行时间与项目数成正比,而我的算法是恒定的,交点约为 75 个项目。

于 2012-07-27T01:49:12.923 回答