一覧PG-05-1 · 反復処理

繰り返し処理と累積計算

同じ数列を反復して合計を求め、初期化の位置による違いを確認します。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

1
values = [2, 2, 5]; total = 0; count = 0; print(values)
[2, 2, 5]
2
for value in values: total += value count += 1 print(count, value, total)
1 2 2
2 2 4
3 5 9
3
for value in values: wrong_total = 0 wrong_total += value print(value, wrong_total)
2 2
2 2
5 5
4
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]
5
def below(value, stop): result = value < stop print("test", value, result) return result
6
i = 0; iterations = 0; total = 0; print(i, iterations, total)
0 0 0
7
while below(i, 6): print("body", i) total += i iterations += 1 i += 2
test 0 True
body 0
test 2 True
body 2
test 4 True
body 4
test 6 False
8
print(i, iterations, total, sum(range(0, 6, 2)))
6 3 6 6

演習完了