4

这是我的代码:

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

我举的一个例子是 print(sum_even(3,7)) ,输出为 0。我不知道出了什么问题。

4

13 回答 13

10

您的缩进已关闭,它应该是:

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


注意:另一个问题 - 你应该小心使用range

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

所以如果你打电话给:

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

现在,它们都会输出10,这对于 3 到 8 之间的偶数之和是不正确的,包括 3 和 8。

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

def sum_even(a, b):
    return sum(i for i in range(a, b + 1) if i % 2 == 0)
于 2012-12-10T21:04:38.473 回答
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).

将所有偶数从ato相加的最快方法可能b

sum(i for i in xrange(a, b + 1) if not i % 2)
于 2012-12-10T21:05:24.370 回答
4

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

def sum_even(a, b):
    return sum(range(a + a%2, b + 1, 2))
于 2012-12-10T21:40:26.333 回答
3

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

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)我并不太担心,因为与删除循环(例如,如果调用)相比,浮点数学的开销可以忽略不计。此外,计算使用 2 的(负)幂,因此不应受到舍入误差的影响。

无论如何,通过将所有内容乘以 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
于 2012-12-10T21:38:13.787 回答
2

如果 b 接近 2^32,我希望你看看你的循环是如何工作的;-) 正如马修所说,不需要循环,但他没有解释原因。

问题只是简单的算术序列维基。该序列中所有项目的总和为:

      (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))

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

于 2012-12-11T10:29:42.413 回答
1

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

于 2012-12-10T21:04:15.317 回答
1

这可能是使用 range 函数的一种简单方法。范围内的第三个数字是步数,即 0、2、4、6...100

sum = 0
for even_number in range(0,102,2):
    sum += even_number
print (sum)
于 2016-01-24T13:31:24.927 回答
0
def sum_even(a,b):
    count = 0
    for i in range(a, b):
        if(i % 2 == 0):
            count += i
     return count

这里有两个错误:

  • 添加 i 而不是 [i]
  • 您在第一次迭代时直接返回值。将返回计数移出 for 循环
于 2012-12-10T21:07:34.660 回答
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)
于 2013-07-13T15:52:08.393 回答
0

使用高级 python 功能更加花哨。

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
于 2016-09-14T20:59:26.850 回答
0

偶数的总和,包括最小和最大数字:

def sum_evens(minimum, maximum):
    sum=0
    for i in range(minimum, maximum+1):
        if i%2==0:
           sum = sum +i
           i= i+1
    return sum

print(sum_evens(2, 6))

输出为:12

sum_evens(2, 6) -> 12 (2 + 4 + 6 = 12)

于 2020-04-09T12:51:09.997 回答
0

基于列表的方法,b+1如果要包含最后一个值,请使用。

def sum_even(a, b):
    even = [x for x in range (a, b) if x%2 ==0 ]
    return sum(even)
   
print(sum_even(3,6))
4

[Program finished]
于 2021-03-25T14:20:33.920 回答
-1

这会将 1 到 10 之间的所有偶数值相加,并输出存储在变量 x 中的答案

x = 0 
for i in range (1,10):
    if i %2 == 0:
        x = x+1
        print(x)
于 2018-11-30T01:36:11.137 回答