【プログラミング】1.2 反復

プログラミング

同じようなことを何回も繰り返すのはなかなか面倒ですよね。でもプログラムにとっては繰り返しは得意な処理であり、とてもよく使われるものです。今回は、この繰り返し処理である反復についてみていきましょう。

反復とは
反復とは、繰り返しのことです。条件式が成立する間、指定した処理を繰り返し実行します。
前回まででみてきた逐次処理と条件分岐に加えてこの反復を加えた3つは、見通しのよいプログラムを作成するために必要な構成要素とされています。(専門的には、構造化プログラミングとも言われます。)
図 逐次処理(左)、条件分岐(中央)、反復(右)
while
pythonで反復を行う書き方の1つとして、while があります。while文の書き方は以下のとおりです。
図 while文の書式
whileは、指定した条件式が成立している間、処理を繰り返して実行します。
この動きをもう少し細かくみていきましょう。

(1)条件式を評価する
・条件式が真であれば、(2)へ

   ・条件式が偽であれば、whileの処理を終わる

(2)インデントされた処理を実行する

(3)再び(1)へ戻る

それでは、変数とwhileを使った反復処理(ループ処理)を書いてみましょう。

i = 0
while i < 10:
    print(i)
    i = i + 1
print("end")

図 変数とwhileによるループ処理

これは、0から9までの数字を順に表示するプログラムです。

2行目にwhileがありますが、その条件式が「i < 10」になっています。つまり、変数iが10よりも小さい間、処理が繰り返されます。それでは、変数iの値はどう変わっていくのでしょうか。
変数iの値に注目しながらプログラムを読んでいきましょう。

まず1行目、ここで変数iは0になります。

そして2行目、変数iは0なのでwhileの条件式が成立します。すると3~4行目が実行されます。
3行目では変数iの値である0が表示されます。

そして4行目では、iに1を足した値がiに代入されます。つまり、iの値を1つだけ増やしているのです(これを、インクリメントと言います)。今、変数iの値が0だったので、0+1で変数iの値が1になりました。

この状態で再びwhileですが、変数iの値は1なので条件はまだ成立しています。

そして3行目で1を表示して、4行目で変数iの値が2になる、というふうに繰り返されます。

最後、変数iの値が10になったところでwhileの条件が成立しなくなり、whileの反復処理を抜けて5行目にいくというわけです。

このように、反復処理の実行回数を変数iで制御しているのですが、こうした変数のことをループ変数とか、ループカウンタと呼びます。

最近のプログラム言語では、ループをもっとスマートに書くことも出来ますが、昔からあるプログラム言語ではループ変数をつかって反復処理を書くことが定番となっていました。

もう1つ、反復処理を使った例を見てみましょう。

sum = 0
x = int(input("整数を入力してください"))
while x != 0:
    sum = sum + x
    print("合計は", sum, "です")
    x = int(input("整数を入力してください(終わるときは0を入力してください)"))
print("おわり")

図 入力された数を足していく

これは、入力された整数を次々に足していき、その合計を表示するプログラムです。

次々と数を足していくために反復処理となっており、処理を終わらせるために0を入力すると条件式により反復処理を抜けるようになっています。

処理を見ていきましょう。

1行目は合計を計算して保持する変数です。

2行目は最初に入力される数を受け取るための処理であり、変数xには入力された値が入ります。

3行目はwhileによる反復処理です。条件式が x!=0 となっているところがポイントであり、入力された数が0であれば、処理を終えるようになっています

4~5行目は足し算と表示です。

6行目は、2回目以降に入力される数を受け取るための処理です。ここで入力された数が変数xに入り、3行目のwhileの条件式で使われます。

プログラムがどう動いていくのか、わかりましたでしょうか。

さて、ここまででループ変数を使った反復処理の例を示しましたが、whileの条件式には注意が必要です。それは、反復処理が必要な間だけ、条件式が真(True)を返すと言うことです。言い換えると、反復処理の必要がなくなったタイミングで、条件式が偽(False)を返すようにしておく必要があります。

例えば次の例を見てみましょう。

i = 0
while i < 10:
    print(i)
print("end")

図 変数とwhileによるループ処理(?)

このプログラムでは、ループ変数iを使って数を表示したいようですが、ループ変数iを加算(インクリメント)する処理がないため、いつまで経っても条件式が真(True)のままです。これでは、プログラムが永遠に終わりません。

こうした処理のことを無限ループと呼び、よくあるバグ(プログラムの間違い)の1つです
なお、特殊なケースにおいては意図的に無限ループを作ることもありますが、あくまで特殊なケースです。

このほかの反復処理

なお、pythonではこのwhileの他にも反復処理を行うことが出来るforがあります。

ちょっと使い方は違うのですが、連続したデータ(シーケンス)に対する繰り返し処理にはとてもよく使われます。これについては後の回で紹介します。

まとめ
  •  反復(ループ)処理とは、条件が成立している間だけ継続される処理構造のこと。
  • pythonでは、whileを使って反復処理を作る方法がある。
  • whileでは、条件式が真(True)となる間、処理が繰り返される。
  • 条件式の書き方によっては、永遠に反復処理が繰り返されてしまう無限ループとなってしまうこともあるため、注意が必要。

コメント

タイトルとURLをコピーしました