テクノロジー
2023年1月1日Python入門6 繰り返し
繰り返しが扱えるようになる
繰り返し
繰り返しを使うことでコンピュータに複雑な処理をさせることができるようになります。繰り返しにはfor
とwhile
があります。
なお、条件分岐(if)や繰り返し(for、while)といったものを 制御構文 と呼びます。制御構文を使うことで複雑なプログラムを書くことができます。
for文
繰り返しの一種 for文 を見ていきます。for文ではforとinを使いますが、これはPythonの予約語です。for文では イテラブルオブジェクト の要素を繰り返し取り出すことができます。イテラブルオブジェクトは、例えばシーケンス型の変数(リスト、タプル、文字列)が挙げられます。
以下はfor文の例です。0から9までの整数が入ったリスト(numbers)の要素をひとつずつnumberとして取り出し、それを表示していくプログラムです。if文と同じくインデントが使われています。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for number in numbers:
print(number)
forとinの間は新しい変数名なので、自由に名前をつけることができます。例えば次のように書き換えても同じ結果が得られます。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for num in numbers:
print(num)
通常の変数名同様、分かりやすい命名を意識しましょう。
タプルの場合も同じように書きます。
user_ids = ("A081", "A114", "A186")
for user_id in user_ids:
print(user_id)
文字列の場合も同様です。文字1つずつが文字列の要素です。
text = "Python"
for character in text:
print(character)
実行すると1文字ずつが改行されて出力されます。
range関数
連続した整数値のリストで繰り返しさせたいということは頻繁にあります。そのため、range関数という便利な組み込み関数が用意されています。以下のプログラムは上の例と同じく0から9までを順番に表示します。range関数の引数10は、10個の値を生成することを意味しています。
for i in range(10):
print(i)
range関数はリストを生成しているのではなく、イテラブルオブジェクトです。list関数を使えばリストに変換できます。
print(range(10))
print(list(range(10)))
実行すると「range(0, 10)」「[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]」と表示されます。
ここで表示されたように、range(10)はrange(0, 10)を省略した形です。これは0から10のひとつ前の値を生成することを示しています。以下は5から9までを生成する例です。
for i in range(5, 10):
print(i)
さらに、ステップ数を指定することもできます。リストのスライスと似ています。
for i in range(5, 10, 2):
print(i)
実行すると「5」「7」「9」と表示されます。
次のように書くことで逆向きに生成することもできます。
for i in range(9, -1, -1):
print(i)
これは組み込み関数のreversed関数を組み合わせた書き方でも実現可能です。reversed関数を使うと、イテラブルオブジェクトを逆順に取り出していきます。
for i in reversed(range(10)):
print(i)
for文とrange関数、len関数を組み合わせた、以下のようなプログラムはよく使われます。
monthly_average_temperatures = [6, 7, 9, 15, 20, 22, 27, 26, 23, 17, 12, 7]
for i in range(len(monthly_average_temperatures)):
print("{}月の平均気温は{}度です。".format(i+1, monthly_average_temperatures[i]))
なお、ここまでの例にあるように、繰り返しのカウントに対してはiという変数名が使われることが多いです。
enumerate関数
何回目の繰り返しなのかという情報を使いたい場合は組み込み関数のenumerate関数が便利です。上の例は以下のように書き換えられ、こちらの方が便利なことが多いです。
monthly_average_temperatures = [6, 7, 9, 15, 20, 22, 27, 26, 23, 17, 12, 7]
for i, temperature in enumerate(monthly_average_temperatures):
print("{}月の平均気温は{}度です。".format(i+1, temperature))
enumerate関数は「繰り返しのカウント, 要素」の形のタプルを返しています。それをi, temperatureのようにタプルで受け取っています。
zip関数
上のenumerate関数を使った12ヶ月の例は、「i+1」を行っているため若干の分かりにくさがあります。「変数名は分かりやすく」との原則を考えると、zip関数を使って以下のような書き方をする方が良いかもしれません。zip関数は、複数のイテラブルオブジェクトを同時に取り出していくための組み込み関数です。enumerate関数同様にタプルで受け取ります。
MONTH_NUMBERS = list(range(1,13))
monthly_average_temperatures = [6, 7, 9, 15, 20, 22, 27, 26, 23, 17, 12, 7]
for month_number, temperature in zip(MONTH_NUMBERS, monthly_average_temperatures):
print("{}月の平均気温は{}度です。".format(month_number, temperature))
while文
もうひとつの繰り返し、while文も見ていきます。while文ではwhile
を使いますが、これはPythonの予約語です。while文は条件式を満たす間、インデントブロック内の処理を繰り返します。
以下はwhile文の例です。変数numが10より小さい間は繰り返します。はじめnumは0で、繰り返すごとに3増えていくので、合計4回繰り返します。
num = 0
while num < 10:
print(num)
num += 3
条件式の書き方はif文と同じです。whileの後にブール型が来て、それがTrueの間は繰り返します。
上の例は break文 と組み合わせ、次のように書き換えることもできます。breakはPythonの予約語で、繰り返しを中断します。
num = 0
while True:
print(num)
num += 3
if num >= 10:
break
while True:
と書くことで、while文は繰り返しを続けることになります。(いわゆる 無限ループ )繰り返しの中でif文とbreak文を用いることで条件判断を行っています。どちらの書き方が見やすいかを状況によって考えて使い分けることになります。繰り返しを抜け出す条件が複数ある時などはwhile True:
が便利なことが多いかもしれません。
仮にbreak文が呼び出されない状況がありえるコードを書いてしまうと、プログラムが動き続けてしまうことになるので注意してください。ただし強制的に止めることは可能で、Colabであれば「ランタイム」の中から「実行を中断」を選択します。
参考文献
4.2. for 文— Python 3.7.3 ドキュメント