簡體   English   中英

Python中從a到b的偶數之和

[英]Sum of even integers from a to b in Python

這是我的代碼:

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。我不知道出了什么問題。

您的縮進已關閉,它應該是:

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 之間的偶數之和是不正確的,包括。

你真正想要的可能是這個:

def sum_even(a, b):
    return sum(i for i in range(a, b + 1) if i % 2 == 0)
  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)

通過正確使用 range 函數的 step 參數,您可以使其簡單得多。

def sum_even(a, b):
    return sum(range(a + a%2, b + 1, 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) )。 此外,計算使用 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

縮進在 Python 中很重要。 您編寫的代碼在第一個項目處理后返回。

如果 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))

當然,您可以添加一些代碼來防止 a 等於或大於 b 等。

這可能是使用 range 函數的一種簡單方法。 范圍內的第三個數字是步數,即 0, 2, 4, 6...100

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

這里有兩個錯誤:

  • 添加 i 而不是 [i]
  • 您在第一次迭代時直接返回值。 將返回計數移出 for 循環

起始數和結束數()之間所有偶數總和

 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)

高級 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

偶數的總和,包括最小和最大數字:

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)

基於列表的方法,如果要包含最后一個值,請使用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]

這會將 1 到 10 之間的所有偶數值相加,並輸出存儲在變量 x 中的答案

x = 0 
for i in range (1,10):
    if i %2 == 0:
        x = x+1
        print(x)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM