繰り返し処理と累積計算
同じ数列を反復して合計を求め、初期化の位置による違いを確認します。rangeとwhileでは開始・終了・更新幅を変え、実際に処理した値と最後の判定を表示します。
説明
forは一覧から要素を順に取り出し、whileは条件が真である間だけ本体を実行します。本体の回数、最後の変数値、終了判定の回数は同じとは限りません。
同じ数列を反復して合計を求め、初期化の位置による違いを確認します。rangeとwhileでは開始・終了・更新幅を変え、実際に処理した値と最後の判定を表示します。
1重複を含む入力列
2、2、5を順に処理します。合計と実行回数の初期値を0にします。
values = [2, 2, 5]入力順を保った一覧; total = 0; count = 0累積値と回数の初期化; print(values)開始時の入力同じ2が二回あっても、それぞれの位置が処理対象です。forは重複を取り除く操作ではありません。
2各回の値と累積を表示
取り出した値をtotalへ足し、その回までの状態を表示します。
for value in values:順番に一つ取り出す
total += value合計を更新
count += 1本体の回数を数える
print(count, value, total)回数・今回値・累積値三回の合計は2→4→9です。最後のvalueは5、回数は3、合計は9で、三つは別の値です。totalは各回の前までの和を保持し、今回のvalueを足して更新しています。
3初期化を内側へ移すとどうなるか
同じ一覧で、合計の初期化を反復の本体へ入れてみます。
for value in values:同じ入力列
wrong_total = 0各回で初期値へ戻す
wrong_total += value今回値だけを加算
print(value, wrong_total)蓄積されない結果毎回0から始まるため、wrong_totalは2、2、5となります。累積ではなく今回の値だけが残りました。全体で一回行う初期化と、各回で行う更新を分ける必要があります。
4rangeの終了値は含まれない
開始・終了・幅の三つを指定して、上昇列と下降列を表示します。
print(list(range(0, 6, 2))0から6未満を2刻み); print(list(range(0, 5, 2))到達しない境界5); print(list(range(5, -1, -2))5から-1より大きい値を-2刻み)上昇二列はどちらも0、2、4です。終了値5に到達しなくても、次の6が範囲外なので終わります。下降列は5、3、1で、終了値-1を含みません。
5whileの判定を可視化する
条件を評価した値と真偽を表示する関数を用意します。
def below(value, stop):終了条件を評価する関数
result = value < stop本体へ入る条件
print("test", value, result)条件の評価記録
return resultwhileへ真偽を返すwhileがこの関数を呼ぶたびにtestが出ます。本体のbodyと別のラベルにすることで、最後に偽となる判定も数えられます。
6反復の開始状態
iを0、回数を0、合計を0へ初期化します。
i = 0; iterations = 0; total = 0反復の状態を初期化; print(i, iterations, total)開始状態を表示次にi<6の間、iを2ずつ増やします。更新前のiを合計へ加えるので、対象の値は0、2、4になるはずです。
7最後の偽の判定も確認する
条件、本体、更新の順に実行します。
while below(i, 6):本体の前に条件を評価
print("body", i)実行した本体を記録
total += i今回の値を合計へ加算
iterations += 1本体回数を増やす
i += 2次回の判定値へ進めるtestは0、2、4、6で四回、bodyは0、2、4で三回です。最後の6では条件が偽なので本体に入りません。whileは本体に入る前に条件を調べるため、最初から偽なら本体0回です。
8反復終了後の状態
最後の制御変数、回数、累積値をまとめて確認します。
print(i, iterations, total, sum(range(0, 6, 2)))終了状態と同じ数列の和i=6、回数3、合計6です。rangeをsumへ渡した結果も6で一致します。制御変数の最後の値6を「六回実行した」と読み違えないようにします。
まとめ
初期化は全体で一回、累積の更新は各回で行います。
本体回数と終了判定回数、最後の制御変数を別々に確認します。
操作履歴と解説を振り返れます。
Python 3
values = [2, 2, 5]; total = 0; count = 0; print(values)[2, 2, 5]
for value in values:
total += value
count += 1
print(count, value, total)1 2 2 2 2 4 3 5 9
for value in values:
wrong_total = 0
wrong_total += value
print(value, wrong_total)2 2 2 2 5 5
print(list(range(0, 6, 2))); print(list(range(0, 5, 2))); print(list(range(5, -1, -2)))[0, 2, 4] [0, 2, 4] [5, 3, 1]
def below(value, stop):
result = value < stop
print("test", value, result)
return resulti = 0; iterations = 0; total = 0; print(i, iterations, total)0 0 0
while below(i, 6):
print("body", i)
total += i
iterations += 1
i += 2test 0 True body 0 test 2 True body 2 test 4 True body 4 test 6 False
print(i, iterations, total, sum(range(0, 6, 2)))6 3 6 6
演習完了