こんにちは、森山です。
前回のコラムでは「モジュール」を学び、HIGH&LOWゲームや「ガチャ」のプログラムを作りましたね。
ただ、前回作ったガチャのプログラムには少し不便な点がありました。
それは、「1回ガチャを引くたびに、毎回実行ボタンを押さなければならない」ということ。
「ガチャを引く → 結果を表示する」という流れは毎回同じです。もしこれを、「同じ処理を自動で何回も繰り返せたら」一気に便利になりそうですよね。
実はこれこそが、プログラミングが最も得意とする同じ処理を繰り返す「自動化」という仕組みなのです。
繰り返し処理(ループ)とは?
プログラムには、「この処理を〇回やって!」と命令できる繰り返し処理(ループ)という仕組みがあります。
ハイスクールPythonの「4. 繰り返し処理で効率アップ」で紹介されていますが、Pythonにはループ処理の書き方がいくつかあります。その中で最もよく使われる for文 について今回は学んでいきたいと思います。
以前学んだ「if文」と役割を整理すると以下のようになります。
- if文(条件分岐):条件によって処理を「枝分かれ」させる。
- for文(繰り返し):決まった回数、同じ処理を「リピート」する。
for文を例えて理解する
第4時限目のコラムでは、if文を使った「もし〜なら」と動きを切り替える条件分岐を学びましたね。RPGで例えるなら、「敵が近ければ剣、遠ければ魔法」と状況に合わせて技を使い分けるイメージです。
今回新しく登場したfor文は、例えると【自動詠唱の魔法陣】です。
これまでのプログラムは、魔法(関数)を1回使うたびに、魔法使いが呪文を唱える(「再生ボタン」を押す)必要がありました。しかし、このfor文という名の魔法陣を使えば、何度も唱え直す必要はありません。
for文という魔法陣の中に繰り返したい処理をセットしておくだけで、同じ命令を繰り返してくれます。
前回作った1回実行するごとに結果が1つ出るだけの「ガチャ」のプログラムも、この【自動詠唱の魔法陣】の中に処理を入れれば、同じ動作を繰り返して実行する「連続ガチャ」が完成します。
さらに、前回登場した range関数 を組み合わせることで、「何回繰り返すか」という回数指定も出来るようになるので、これらを使って10連ガチャを作ってみましょう!
range関数を思い出そう
まず、第5時限目に登場した range(1, 14) というコードを思い出してみましょう。
これは「1から13までの数字を順番に用意する」という命令でした。
実はこの range関数 は、for文ととても相性の良い相棒的な存在です。
- range(10) と書くと……
→ 「0から9までの、合計10個の数字」を準備してくれます。
これをfor文と組み合わせることで、「数字を1つ取り出すたびに1回処理する=合計10回繰り返す」という動きが作れるのです。
for文の書き方のルール(マナー)
それではここで、for文の「基本の形」を確認しておきましょう。
10回繰り返したい場合、Pythonでは次のように書きます。
for i in range(10):
# ここに繰り返したい処理を書くこの書き方、以前学んだ if文の書き方と少し似ていますよね。
if文と同じ「コロン」と「インデント」
if文の時、条件を書く行の最後に :(コロン) を付け、その下の行には 「インデント」 を入れました。for文も同じルールで書くのですが、if文の時に学んだ内容を思い出しながらおさらいしておきましょう。
- 行末の「:(コロン)」を忘れずに!
for i in range(10) の行末には、必ず 「:(コロン)」を付けます。これがあることで、Pythonは「この下の行から、繰り返し実行する中身が始まるんだな」と認識してくれます。
- 繰り返す処理は「インデント」の後に書く!
「:(コロン)」 の次の行からは、必ず半角スペース4つ分空けてから書き始めます。このブロックに繰り返し実行する処理の内容を書いていきます。
forの次に書かれている「i」って何?
for文の中に書かれている i というアルファベット。これには、「今、何回目の繰り返しかな?」を数えるカウンター用の変数(箱)という役割があります。
- 中身が入れ替わる「箱」 range(10) が用意した 0, 1, 2… という数字が、1回繰り返すごとにこの i という箱の中に順番に入っていきます。
- なぜ「i」なの? 英語で「回数」や「整数」を意味する Index や Integer の頭文字をとって i と書くのがプログラミングの世界の定番で、よく使われています。
- 名前は自由! ただ、絶対 i でなければいけないわけではありません。for 〇〇 in range(10): という形であれば〇〇の所は i 以外の名前でも大丈夫です。
10連ガチャを実装してみよう!
では、前回作ったガチャのプログラムを改造して「10連ガチャ」を作ってみましょう。
書き方はとてもシンプル。for文の中に、if文をそのまま入れるだけ。それだけで10回繰り返すプログラムにすることができます。
実際のコードは以下のようになります。
import random
print("--- 10連ガチャを回します! ---")
# range(10)で「0〜9」の数字を順番に取り出し、10回繰り返す
for i in range(10):
r = random.random() # 0.0〜1.0 の乱数を取得
# R が70%、SR が20%、SSR が10%の確率で結果を出力
if r < 0.7:
result = "R(レア)"
elif r < 0.9:
result = "SR(Sレア)"
else:
result = "SSR(超絶レア!)"
# i+1 を使って「何回目」かを表示(iは0から始まるため)
print(f"{i+1}回目:結果は {result} です!")このプログラムをいつものようにGoogle Colabで実行してみてください。
1回再生ボタンを押しただけで、一瞬で10回分の結果がズラッと表示されたはずです。SSRは出たでしょうか?
ここがポイント!
- for i in range(10):
range(10) が用意した数字を、変数 i という「箱」に1つずつ入れながらループします。 - 入れ子のインデント(字下げ)
Pythonでは、「段下げ(インデント)されている範囲が、その命令の有効範囲」という決まりがあります。今回の10連ガチャのコードでは、インデントが二段階(入れ子)になっていることに注目しましょう。- 一段目のインデント(for文の中身):for の行の下はすべて「10回繰り返される処理」です。
- 二段目のインデント(if文の中身): さらにその中の if や else の下で、もう一段右に段下げされている行があります。これは「もし条件に合っていたら、その時だけ実行する処理」という分岐後の処理の内容です。
このように、右にズラせばズラすほど「内側」の処理になっていきます。 もしこの段下げがズレてしまうと、「どこまでが繰り返しの範囲で、どこからが条件分岐の範囲か」を判断できず、エラーになったり、思い通りに動かなくなったりしてしまいます。
「今、自分はどこの範囲の処理を書いているのか」を意識して書くことが重要です。
- i + 1 のナゾ
以前の説明にもあったようにプログラムでは数を「0」から数え始めます。そのまま表示すると「0回目」になってしまうので、人間に分かりやすくするために + 1 をして「1回目」から表示させています。
for文で作る「自動化」の世界
for文を使えるようになると、プログラムで出来ることが大幅に広がります。
- 1000連ガチャを一瞬でシミュレーションする。
- クラス全員分のテストの成績を一括計算する。
- 大量のデータから特定の名前だけを自動で見つけ出す。
これらは全て「同じことを何度もやる」という処理です。この中に条件分岐を入れる事で、今回の10連ガチャのように違う結果を出すことも出来るようになってきます。
プログラムを作る時に、この動きは同じだなと思ったら繰り返し処理を使ってみてください。
ハイスクールPythonの「4.1 for 文で決まった回数繰り返す」では、for 文のいろいろな使い方について解説されていますので、それらも参考にして色々なプログラムに挑戦してみてください。
最後までお読みいただき、ありがとうございました。
それでは、また次回お会いしましょう!
