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 までの偶数の整数の合計には正しくありません。

あなたが本当に欲しいのはおそらくこれです:

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 - 1b1range(a,b)abrange(a, b+1)

aからまでのすべての偶数を加算するおそらく最も速い方法bは、

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

範囲関数にステップ引数を適切に使用することで、それよりもはるかに簡単にすることができます。

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 に近い場合にループがどのように機能するかを確認してください ;-) Matthew が言ったように、必要なループはありませんが、彼はその理由を説明していません。

問題は単純な算術シーケンス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

ここで、2 つの偶数の間にいくつの項目があるか考えてみてください - それは次のとおりです。

    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 と等しいか、b より大きくならないようにコードを追加することもできます。

于 2012-12-11T10:29:42.413 に答える
1

Python ではインデントが重要です。記述したコードは、最初のアイテムが処理された後に返されます。

于 2012-12-10T21:04:15.317 に答える
1

これは、range 関数を使用して行う簡単な方法かもしれません。範囲の 3 番目の数値はステップ番号、つまり 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

高度な 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_even(a,b):
    count = 0
    for i in range(a, b):
        if(i % 2 == 0):
            count += i
     return count

ここで2つの間違い:

  • [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 に答える