Python 基本編 第5回

この章では、プログラムの特定の範囲を何度か繰り返す「繰り返し」について学んでいきましょう

繰り返しには「for(フォー)文」と 「while(ワイル)文」が存在します
for文はあらかじめ繰り返しの回数が分かっているときに使用します
一方、while文はある条件がTrueの間だけ繰り返すときに使用します
while文は、条件がFalseにならないと終了しないので、条件の書き方によっては、無限ループになりコンピュータが止まらなくなる危険性があります

for文

for文は次のように記述します

for 変数名 in イテラブルオブジェクト:
  # 反復処理における処理
  処理A
  処理B

イテラブルオブジェクトとは、要素を順番に取り出せるオブジェクトのことです
2回目に学習した文字列もイテラブルオブジェクトの一つです
また、6回目以降に学習する予定のリストや辞書、タプルもイテラブルオブジェクトです
イテラブルオブジェクトから順番に取り出した要素を変数に代入し、その変数を使い、処理を実行します
イテラブルオブジェクトの直後に:(コロン)をつけ、インデントをつけて処理を記述します
インデントしている限り、for文の内側として扱われます

たとえば文字列にfor文を適用し1文字ずつ取り出すには、次のように記述します

for x in "PYTHON":
    print(x)
実行結果
P
Y
T
H
O
N

変数xには、1回目はP、2回目はY、3回目はTと、指定した文字列の1文字ずつが順番に代入されていき、文字列の末尾に達したら繰り返しも終了となります

また、繰り返しの回数や範囲を数値で指定したいときは、for文とrange関数を組み合わせて使います
range関数は、範囲を表す「rangeオブジェクト」というイテラブルオブジェクトなので、for文と組み合わせて使用することができます

range(終了値)

0から「終了値-1」まで1ずつ増加します

range(開始値,終了値)

「開始値」から「終了値-1」まで1ずつ増加します

range(開始値,終了値,ステップ)

「開始値」から「終了値-1」までステップずつ変化します

たとえば、プログラムを3回繰り返したい場合は、以下のように記述します

for i in range(3):
  print(i)
実行結果
0
1
2 

in range(3)と指定すると、i は繰り返すたびに 0, 1, 2 と 1 ずつ増え、3回ループして処理を終了します

1から10までの足し算を行う場合、以下のように記述します

sum = 0
for i in range(1,11):
  sum = sum + i
print(sum)
実行結果
55

「開始値」から「終了値-1」まで1ずつ増加するので、range(1,11)になっていることに注意してください

また、for文の中にfor文を書く場合は以下のように記述します
※このように、ある構造の中に別の構造を入れ子に記述することをネストといいます

sum = 0
for i in range(5):
  print("i="+str(i))
  for j in range(3):
    sum = sum + 1
print("sum="+str(sum))
実行結果
i=0
i=1
i=2
i=3
i=4
sum=15

ネストするブロックは、インデントして記述します

for文の中にif文を入れ子にすることもできます
以下は、整数1から5までの整数で偶数の値だけを取り出すプログラムです

for i in range(1,6):
  if i % 2 == 0:
    print(str(i)+" ",end="")
実行結果
2 4

「i % 2」はiを2で割った余りを計算しています
「i % 2」の余りが0のとき偶数であるため、この条件がTrueになるときiの値を表示しています
上記のプログラムでは、print関数のキーワード引数であるendを使いました
endとは、print関数の最後に付け足すものを指定するために使います
print関数は、関数終了時に自動的に改行を実行されるようになっています
しかしend= “”を指定することで、”何もしない”を指定したことになり、改行されなくなります

【演習問題】

  1. forループを⽤いて、1から100までの整数の和を計算し結果を表⽰するプログラムを作成する
   実行結果
   1から100までの和は5050
  1. forループを⽤いて、1から100までの整数のうち偶数の和を計算し結果を表⽰するプログラムを作成する
   実行結果
   1から100までの偶数の和は2550
  1. forの⼆重ループを⽤いて、以下のように九九を表⽰させるプログラムを作成する
   実行結果
   1 2 3 4 5 6 7 8 9 
   2 4 6 8 10 12 14 16 18 
   3 6 9 12 15 18 21 24 27 
   4 8 12 16 20 24 28 32 36 
   5 10 15 20 25 30 35 40 45 
   6 12 18 24 30 36 42 48 54 
   7 14 21 28 35 42 49 56 63 
   8 16 24 32 40 48 56 64 72 
   9 18 27 36 45 54 63 72 81 
  1. forループを⽤いて、1から100までの乱数を5回発⽣させ表⽰し、終了後その中の最⼤値を表⽰するプログラムを作成する
  実行結果
  68 45 27 31 73 
  最大値は73
  1. forループを⽤いて、1から100までの乱数を10回発⽣させ表⽰し、奇数のみの和と偶数のみの和をそれぞれ表⽰するプログラムを作成する
  83 18 64 51 25 31 54 99 98 75 
  偶数の和は320
  奇数の和は274

while文

for文はイテラブルオブジェクトに対して繰り返しを行いますが、while文は指定した式の値がTrueである限り繰り返しを続けます
多くの繰り返し処理はfor文を使って書くことができますが、何回繰り返すか不明の場合などfor文で書きにくい繰り返しがあった場合while文を使います
while文は次のように記述します

while:
    処理A
    処理B

式の後ろに:(コロン)を書いて改行し、次の行からインデントして処理を記述します
for文と同様にインデントしている間、while文の内側として扱われます

以下に、while文を使ったサンプルプログラムを示します
iが10よりも小さい間ループをする処理をしています

i = 0
while i < 10:
  print(str(i)+" ",end="")
  i = i + 1
実行結果
0 1 2 3 4 5 6 7 8 9 

whileに続く 「i < 10」 が式になります
この式がTrueの間ループされ、iが10になった時点でwhile文を抜けています

以下のように、入力した値が任意の文字になるまでループを繰り返すことができます

while (val := input("文字列を入力してください(q:終了)")) != "q":
  print(val)

print("終了します")
実行結果
文字列を入力してください(q:終了)1
1
文字列を入力してください(q:終了)2
2
文字列を入力してください(q:終了)q
終了します

:=」は Python3.8から追加された代入演算子です
代入する際に使用するイコール(=)は代入の結果を式として評価することができません
しかし=の代わりに := を用いることで代入の結果を式として評価することが可能となりました
:= がセイウチの目と牙に似ていることからセイウチ演算子とも呼ばれます
このサンプルプログラムでは、input関数で取得した文字列をvalに代入し、値が”q“ではない間ループを続けます

【演習問題】

  1. whileループを⽤いて、1から100までの整数の和を計算し結果を表⽰するプログラムを作成する
   実⾏結果
   1から100までの和は5050
  1. whileループを⽤いて、1から100までの整数のうち奇数の和を計算し結果を表⽰するプログラムを作成する
   実⾏結果
   1から100までの奇数の和:2500
  1. whileループの中で、標準⼊⼒により整数を取得し取得した値が0のとき終了するプログラムを作成する
   実⾏結果
   数値を⼊⼒してください(0=終了):1
   ⼊⼒した値は1です
   数値を⼊⼒してください(0=終了):2
   ⼊⼒した値は2です
   数値を⼊⼒してください(0=終了):0
   ⼊⼒した値は0です
   終了します
  1. 整数nを定義し、nを2で割った商をnに代入する処理をnが0になるまで続けるプログラムを作成する
   実行結果
   開始する整数は25です
   25 12 6 3 1 0 終了しました

break文

break文は、while文またはfor文の内部で使用し、ループの内部の残りの文を実行せずにループを終了することができます

以下は、3回目のprint関数の手前で中断するサンプルプログラムです

for i in range(3):
    if i==2:
        break
    print(i)
実行結果
0
1

ループ処理を3回繰り返しprint関数を実施していますが、iが2になったところでループを中断し3回目のprint関数を実行しないようにしています
本来は0,1,2と表示されるところが、このサンプルでは0,1と出力されループが止まることが確認できました

while文の説明で使用したサンプルプログラムもbreak文を使用して以下のように書き換えることができます

while (val := input("文字列を入力してください(q:終了)")) != "q":
  print(val)

print("終了します")

while True:
  val = input("文字列を入力してください(q:終了)")
  if val == "q":
    print("終了します")
    break
    
  print(val)

条件式がTrueと記述されています。このように記述することで、常にTrueの状態になり無限ループを作っています
valの値が”q“になった時点で、break文を実行しループを抜けています

【演習問題】

  1. 任意の整数a,bを外部から入力し、a + bの値が偶数の場合ループを終了するプログラムを作成する
   実行結果
   整数aを入力してください:1
   整数bを入力してください:2
   1+2=3
   整数aを入力してください:4
   整数bを入力してください:6
   4+6=10
   終了します
  1. 1から10までの整数の和をもとめる。しかし、和が20より大きくなったら終了するものとする
   実行結果
   1から6までの和は21

continue文

continue文もfor文やwhile文の内部で使用します
continue文を使うと、ループの内部にある残りの文を実行せずに、次の繰り返しに移ることができます

以下は、5回ループする中で、i=2(3回目)のprint関数をスキップするサンプルプログラムです

for i in range(5):
    if i==2:
        continue
    print(i)
実行結果
0
1
3
4

i=2のときの出力はされず、次のループ処理に移っていることが確認できます

以下は、1から10までの奇数の和を計算するサンプルプログラムです

sum = 0
for i in range(1,11):
  if i % 2 == 0:
    continue
  sum = sum + i
print("1から10までの奇数の和は"+str(sum))
実行結果
1から10までの奇数の和は25

if i % 2 == 0:と書くことで、偶数のときの処理をスキップしています

【演習問題】

  1. for⽂とcontinue文を⽤いて、1から100までの和を計算する。ただし、3で割り切れる数のときはスキップするものとする
   実行結果
   1から100までの和は3367
  1. 文字列”H_E_L_L_O”を定義し、for文とcontinue文を用いて、”HELLO”と表示するプログラムを作成する
   実行結果
   HELLO

for文、while文のelse節

if文にはelse節をつけることができましたが、while文やfor文にもelse節をつけることができます
if文のときのelse節は、式の値がFalseのときにelse節を実行していました
for文やwhile文でのelse節は、ループが正常に完了した場合にのみ実行されるコードを指定することができます
また、ループ内のすべての処理を実行した後にelse節が実行されるため、ループが一度も実行されなくてもelse節が実行されます
ただし、break文によって繰り返しが中断されるときには実行されません

以下のように記述します

while:
  処理A(ループ内の処理)
else:
  処理B(ループが正常に終了した場合の処理)

for 変数 in イテラブルオブジェクト:
  処理A(ループ内の処理)
else:
  処理B(ループが正常に終了した場合の処理)

1から10までの足し算の和を計算するサンプルプログラムは以下のように記述します

sum = 0
for i in range(1,11):
  sum = sum + i
else:
  print(sum)
実行結果
55

また、1から10までの和が20以上になった場合処理を中断する場合のプログラムを実行してみましょう

sum = 0
for i in range(1,11):
  sum = sum + i
  if sum >20:
    print("1から" + str(i) + "までの和は"+str(sum))
    break
else:  
  print("正常に終了しました")
実行結果
1から6までの和は21

break文によって繰り返しが中断されたときのprint関数は実行されていますが、else節のprint関数は実行されていないことがわかります

一方、以下のサンプルプログラムでは、while文のループが一度も実行されない場合でも、else節が実行されていることがわかります

i = 10
while i < 0:
  print(str(i)+" ",end="")
  i = i - 1
else:
  print("終了しました")
実行結果
終了しました

for文やwhile文のelse節は、ループが正常に終了した場合に限り、特定の処理を実行するのに役立つ機能です
実務では、必要に応じてelse節を記述することで、コードの可読性と保守性を向上させることができます
しかし、else節の使用が必ずしも必須ではない場合もありますし、状況に応じて適切に使い分けることが重要です

コメント

この記事へのコメントはありません。

関連記事

C言語 応用編 ~3日目~

Python 基本編 第2回

プログラミングしなくてもアプリを作れるツール

PAGE TOP