2012-12-10 23 views
4

到b这是我的代码:总和在Python

def sum_even(a, b): 
    count = 0 
    for i in range(a, b, 1): 
     if(i % 2 == 0): 
      count += [i] 
     return count 

我把打印是(sum_even(3,7))的一个例子,输出为0。我想不出什么是错的。

+4

'总和(I为i的范围(A,B)若设为i%2 == 0)' –

+1

考查等差级数。 –

+1

哪个'if'语句是与'return'关联的?间距很重要。 – eh9

回答

9

你压痕是关闭的,它应该是:

def sum_even(a, b): 
    count = 0 
    for i in range(a, b, 1): 
     if(i % 2 == 0): 
      count += i 
    return count 

使return count没有得到作用域的for循环(在这种情况下,它会返回在第一次迭代,使其返回0)

(而变化[i]i


注: ANO疗法的问题 - 你应该小心使用range

>>> range(3,7) 
[3, 4, 5, 6] 

所以,如果你是做呼叫:

  • sum_even(3,7)
  • sum_even(3,8)

现在,他们会都输出10,对于3和8之间的偶数和的总和是不正确的。

你真正想要的可能是这个:

def sum_even(a, b): 
    return sum(i for i in range(a, b + 1) if i % 2 == 0) 
+0

我测试了print(sumEven(3,7)),输出结果为0 – knd15

+0

@ knd15您是不是想用'print sum_even(3,7)'来测试它呢? –

+0

@ knd15我在关于'范围'的答案中注意到了另一个问题,请确保你看到了编辑=) –

1

缩进在Python中很重要。您编写的代码在处理第一个项目后返回。

5
  1. 移动return声明了for循环的范围(否则你将返回在第一循环迭代)。

  2. count += [i]更改为count += i


也(不知道你是否知道这一点),range(a, b, 1)将包含所有号码从ab - 1(不b)。而且,您不需要1参数:range(a,b)将具有相同的效果。因此,要包含从ab的所有数字,您应该使用range(a, b+1)

可能是所有的偶数添加从ab的最快方法是在这里

sum(i for i in xrange(a, b + 1) if not i % 2) 
+0

+1,非常具有可读性和启发性 – dansalmo

0
def sum_even(a,b): 
    count = 0 
    for i in range(a, b): 
     if(i % 2 == 0): 
      count += i 
    return count 

两个错误:

  • 加的我,而不是[I]
  • 你在第一次迭代时直接返回值。将返回计数移出for循环
2

您不需要循环;您可以使用简单的代数:

def sum_even(a, b): 
    if (a % 2 == 1): 
     a += 1 
    if (b % 2 == 1): 
     b -= 1 
    return a * (0.5 - 0.25 * a) + b * (0.25 * b + 0.5) 

编辑:

由于NPE指出,我原来的解决方案上面使用浮点数学。我并不太在意,因为与清除循环相比,浮点数学的开销可以忽略不计(例如,如果调用sum_even(10, 10000))。此外,计算使用两个(负)幂,所以不应该受到舍入误差的影响。

无论如何,用所有东西都乘以4的简单技巧,然后在最后再次分割,我们可以使用整数,这是更可取的。

def sum_even(a, b): 
    if (a % 2 == 1): 
     a += 1 
    if (b % 2 == 1): 
     b -= 1 
    return (a * (2 - a) + b * (2 + b))/4; 
+0

如果它不使用浮点数学计算整数和。 – NPE

+0

@NPE好点。请参阅我的编辑。 –

3

通过正确使用range函数的step参数,可以使它变得简单得多。

def sum_even(a, b): 
    return sum(range(a + a%2, b + 1, 2)) 
+0

+1,而且要快得多。 – dansalmo

1

我想你看到你的循环是如何工作的。如果B接近2^32 ;-) 马修说,没有需要循环,但他并没有解释为什么。

问题是简单的算术序列wiki。在这样的序列的所有项目总和为:

 (a+b) 
Sn = ------- * n 
     2 

其中“a”是第一项,“B”是最后的和“n”是,如果项目数。 如果我们做'a'和b'偶数,我们可以很容易地解决给定的问题。 所以使得“A”和“B”,甚至仅仅是:

if ((a & 1)==1): 
    a = a + 1 
if ((b & 1)==1): 
    b = b - 1 

现在想想有多少项目要有两个偶数之间 - 它是:

b-a 
n = --- + 1 
    2 

把它放进方程和你得到:

 a+b  b-a 
Sn = ----- * (------ + 1) 
     2   2 

所以代码如下:

def sum_even(a,b): 
    if ((a & 1)==1): 
     a = a + 1 
    if ((b & 1)==1): 
     b = b - 1 
    return ((a+b)/2) * (1+((b-a)/2)) 

当然你可以添加一些代码来防止等于或大于b等。

0

开始结束数(含)之间的所有甚至数的总和

def addEvenNumbers(start,end): 
    total = 0 
    if end%2==0: 
    for x in range(start,end): 
     if x%2==0: 
     total+=x 
    return total+end 
    else: 
    for x in range(start,end): 
     if x%2==0: 
     total+=x 
    return total 
print addEvenNumbers(4,12) 
0

这可能是一个简单的使用范围函数的方法。 在范围中的第三数目的工序数,即,0,2,4,6 ... 100

sum = 0 
for even_number in range(0,102,2): 
    sum += even_number 
print (sum) 
0

点点花式具有先进蟒特征。

def sum(a,b): 
    return a + b 
def evensum(a,b): 
    a = reduce(sum,[x for x in range(a,b) if x %2 ==0]) 
    return a