Python制御構文

この講座では、Pythonの制御構文について学びます。

  • 条件分岐(if / elif / else)
  • 比較演算子と複合条件(and, or, not)
  • whileループ
  • forループ(range)
  • break と continue によるループ制御

1. 事前準備

この講座のハンズオンでは、以下のツールやアカウントが必要です。まだ準備できていない場合は、リンク先の手順に沿って準備をお願いします。

2. 条件分岐

プログラムは通常、上から順に1行ずつ実行されます。しかし実際のプログラムでは、「ある条件を満たしたときだけ特定の処理を実行したい」という場面が多くあります。条件分岐は、条件の結果に応じて実行する処理を切り替える仕組みです。Pythonでは if 文を使って条件分岐を記述します。

2.1 if文の基本

if文は、条件に応じて処理を分岐させるための構文です。条件が True の場合にブロック内の処理が実行されます。基本的な構文は以下のとおりです。

if 条件式:
    # 条件がTrueのときの処理

if の後に条件式を書き、末尾にコロン(:)を付けます。条件が True の場合、インデントされたブロック内の処理が実行されます。

if文の評価の流れを以下の図に示します。

flowchart TD
    A(["開始"]) --> B{"条件式"}
    B -- "True" --> C["条件がTrueのときの処理"]
    C --> D(["終了"])
    B -- "False" --> D

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。このプログラムは、scoreが80以上であれば「合格です!」と表示するプログラムです。

score = 81

if score >= 80:
    print("合格です!")

実行すると以下のように出力されます。

合格です!

score が81で、score >= 80 の条件を満たしているため、print() が実行されました。では、score を79に変更して再度実行してみましょう。

score = 79

if score >= 80:
    print("合格です!")

今度は何も表示されません。score >= 80 の条件を満たさないため、if文の中の処理がスキップされたためです。このように、if文は条件が True のときだけブロック内の処理を実行します。

📝 インデントについて
Pythonでは、ブロック(処理のまとまり)をインデント(字下げ)で表現します。一般的にスペース4つが使用されます。インデントが正しくないとエラーになるため、注意してください。

2.2 if / else文

先ほどの例では、条件を満たさない場合に何も表示されませんでした。条件に一致しない場合にも処理を実行したいときは else を使います。基本的な構文は以下のとおりです。

if 条件式:
    # 条件がTrueのときの処理
else:
    # 条件がFalseのときの処理

条件が True の場合は if ブロックの処理が、False の場合は else ブロックの処理が実行されます。

if / else文の評価の流れを以下の図に示します。

flowchart TD
    A(["開始"]) --> B{"条件式"}
    B -- "True" --> C["条件がTrueのときの処理"]
    B -- "False" --> D["条件がFalseのときの処理"]
    C --> E(["終了"])
    D --> E

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。このプログラムは、先ほどのプログラムに対して、条件を満たさない場合に「もっと頑張りましょう!」と表示するものです。

score = 79

if score >= 80:
    print("合格です!")
else:
    print("もっと頑張りましょう!")

実行すると以下のように出力されます。

もっと頑張りましょう!

score が79で条件を満たさないため、else のブロックが実行されました。score を80に変更して再度実行してみましょう。

score = 80

if score >= 80:
    print("合格です!")
else:
    print("もっと頑張りましょう!")

実行すると以下のように出力されます。

合格です!

score >= 80 は「80以上」を意味するため、score が80の場合も条件を満たし、「合格です!」と表示されます。

2.3 if / elif / else文

elif(else if の略)を使うことで、複数の条件を順番に評価できます。基本的な構文は以下のとおりです。

if 条件式1:
    # 条件式1がTrueのときの処理
elif 条件式2:
    # 条件式2がTrueのときの処理
else:
    # すべての条件がFalseのときの処理

if / elif / else文の評価の流れを以下の図に示します。

flowchart TD
    A(["開始"]) --> B{"条件式1"}
    B -- "True" --> C["条件式1の処理"]
    B -- "False" --> D{"条件式2<br>(elif)"}
    D -- "True" --> E["条件式2の処理"]
    D -- "False" --> F["elseの処理"]
    C --> G(["終了"])
    E --> G
    F --> G

条件は上から順に評価され、最初に True となった条件のブロックだけが実行されます。どの条件にも一致しない場合は else のブロックが実行されます。

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

score = 65

if score >= 80:
    print("合格です!")
elif score >= 60:
    print("惜しい、あと少し!")
else:
    print("もっと頑張りましょう!")

実行すると以下のように出力されます。

惜しい、あと少し!

score が65なので、最初の score >= 80 は満たしませんが、次の score >= 60 を満たすため、「惜しい、あと少し!」が表示されました。score の値を変えると、結果は以下のように変わります。

scoreの値 評価される条件 出力
95 score >= 80 → True 合格です!
80 score >= 80 → True 合格です!
65 score >= 60 → True 惜しい、あと少し!
60 score >= 60 → True 惜しい、あと少し!
45 どの条件にも一致しない もっと頑張りましょう!
💡 ポイント
elif は複数記述できます。条件は上から順に評価され、最初に True となった条件のブロックだけが実行されます。どの条件にも一致しない場合は else のブロックが実行されます。

2.4 比較演算子

ここまでの例では >= を使ってきましたが、Pythonでは条件分岐の判定にさまざまな比較演算子を使えます。代表的なものは以下のとおりです。

演算子 意味
== 等しい value == 10
!= 等しくない value != 10
< より小さい value < 10
> より大きい value > 10
<= 以下 value <= 10
>= 以上 value >= 10
📝 等値比較の注意点
「等しい」の比較には == を使用します。= は代入演算子であり、条件式に使用するとエラーになります。初心者がよく間違えるポイントなので注意してください。

2.5 真偽値と条件

if文の条件式は、最終的に True(真)または False(偽)のどちらかに評価されます。この True / False の値を真偽値(bool型)と呼びます。

# 比較演算子の結果はTrue または False になる
条件式  # → True または False

# 真偽値を直接if文に渡すこともできる
if True:
    # 必ず実行される

if False:
    # 実行されない

比較演算子(==, !=, <, >, <=, >=)を使った式は、結果として TrueFalse を返します。この仕組みにより、if文は条件の真偽に応じて処理を切り替えています。

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

print(10 > 5)
print(10 < 5)

実行すると以下のように出力されます。

True
False

10 > 5 は成り立つので True10 < 5 は成り立たないので False になります。if文はこの結果を見て、True なら処理を実行し、False ならスキップしています。

TrueFalse を直接if文に渡すこともできます。

if True:
    print("これは必ず実行されます")

if False:
    print("これは実行されません")

実行すると以下のように出力されます。

これは必ず実行されます

if False: の中の処理は実行されないため、2つ目の print() は表示されません。

また、条件式の結果をbool型の変数に格納しておくこともできます。条件の判定とif文を分けて書けるため、コードが読みやすくなります。

age = 20
is_adult = age >= 18

print(is_adult)

if is_adult:
    print("成人しています")

実行すると以下のように出力されます。

True
成人しています

age >= 18 の結果(True)が変数 is_adult に格納され、それをif文の条件として使用しています。

2.6 複合条件(and, or, not)

複数の条件を組み合わせたい場合、論理演算子andornot)を使います。ここでは、数学と英語の2科目のスコアを使って説明します。

and(かつ)

and を使うと、両方の条件が True の場合にのみ全体が True になります。基本的な構文は以下のとおりです。

if 条件式1 and 条件式2:
    # 両方の条件がTrueのときの処理

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

math_score = 85
english_score = 75

if math_score >= 80 and english_score >= 80:
    print("両方の科目で80点以上です")
else:
    print("80点未満の科目があります")

実行すると以下のように出力されます。

80点未満の科目があります

数学は85点で条件を満たしていますが、英語が75点で条件を満たしていないため、and の結果は False になります。

or(または)

or を使うと、いずれかの条件が True であれば全体が True になります。基本的な構文は以下のとおりです。

if 条件式1 or 条件式2:
    # いずれかの条件がTrueのときの処理

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

math_score = 85
english_score = 75

if math_score >= 80 or english_score >= 80:
    print("80点以上の科目があります")
else:
    print("どちらも80点未満です")

実行すると以下のように出力されます。

80点以上の科目があります

英語は条件を満たしていませんが、数学が85点で条件を満たしているため、or の結果は True になります。

not(否定)

not を使うと、条件の真偽を反転させます。基本的な構文は以下のとおりです。

if not 条件式:
    # 条件がFalseのときの処理(Trueを反転してFalseにする)

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

math_score = 85

if not math_score >= 80:
    print("数学は80点未満です")
else:
    print("数学は80点以上です")

実行すると以下のように出力されます。

数学は80点以上です

math_score >= 80True ですが、not で反転して False になるため、else のブロックが実行されます。

論理演算子のまとめ

a b a and b a or b not a not b
True True True True False False
True False False True False True
False True False True True False
False False False False True True

2.7 match / case文

Python 3.10 以降では、match / case 文(構造的パターンマッチング)が使えます。他の言語の switch 文に似た構文で、値に応じた分岐を簡潔に記述できます。基本的な構文は以下のとおりです。

match 変数:
    case1:
        # 変数が値1に一致したときの処理
    case2:
        # 変数が値2に一致したときの処理
    case _:
        # どの値にも一致しなかったときの処理

match の後に評価したい値を書き、case で一致するパターンを列挙します。case _ はどのパターンにも一致しなかった場合の処理で、if / elif / elseelse に相当します。

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

status = 404

match status:
    case 200:
        print("OK")
    case 404:
        print("Not Found")
    case _:
        print("Unknown")

実行すると以下のように出力されます。

Not Found

status が404なので、case 404 に一致し「Not Found」が表示されました。分岐のパターンが多い場合に if / elif / else よりも見通しよく書けるため、覚えておくとよいでしょう。

3. 繰り返し

例えば、「1から100までの数字を画面に表示する」という処理を考えてみましょう。print(1)print(2)print(3)…と100行書くのは現実的ではありません。繰り返し(ループ)を使えば、こうした処理をわずか数行で実現できます。Pythonには、条件を満たす間繰り返す while 文と、繰り返す回数や対象が決まっている場合に使う for 文の2種類があります。

3.1 whileループ

whileループは、条件が True である限り処理を繰り返す構文です。基本的な構文は以下のとおりです。

while 条件式:
    # 条件がTrueの間、繰り返す処理

while の後に条件式を書き、その条件が True である限りブロック内の処理が繰り返し実行されます。条件が False になるとループが終了します。

whileループの流れを以下の図に示します。

flowchart TD
    A(["開始"]) --> B{"条件式"}
    B -- "True" --> C["繰り返す処理"]
    C --> B
    B -- "False" --> D(["ループ終了"])

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

retry_count = 0
max_retries = 5

while retry_count < max_retries:
    print(f"接続を試行中... ({retry_count + 1}/{max_retries})")
    retry_count += 1

print("全ての試行が完了しました")

実行すると以下のように出力されます。

接続を試行中... (1/5)
接続を試行中... (2/5)
接続を試行中... (3/5)
接続を試行中... (4/5)
接続を試行中... (5/5)
全ての試行が完了しました

retry_countmax_retries(5)に達するまでループが繰り返され、5回の試行メッセージが出力されています。ループ終了後に「全ての試行が完了しました」が表示されています。

💡 ポイント
whileループの条件が永遠に True のままだと、プログラムが終了しません(無限ループ)。必ずループ内で条件が False になる仕組みを入れるか、break で脱出する処理を組み込んでください。万が一無限ループに陥った場合は、Ctrl + C で強制終了できます。

3.2 forループ

range を使ったforループ

forループは、繰り返し処理を行うための構文です。range() 関数を使うと、指定した回数だけ繰り返すことができます。基本的な構文は以下のとおりです。

for 変数名 in range(回数):
    # 繰り返す処理

for の後にループ変数を書き、in range(回数) で繰り返す回数を指定します。ループ変数には、繰り返しのたびに0から順番に値が代入されます。

forループの流れを以下の図に示します。

flowchart TD
    A(["開始"]) --> B{"次の値が<br>あるか"}
    B -- "あり" --> C["変数に値を代入"]
    C --> D["繰り返す処理"]
    D --> B
    B -- "なし" --> E(["ループ終了"])

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

for i in range(5):
    print(i)

実行すると以下のように出力されます。

0
1
2
3
4

range(5) は 0 から 4 までの数値を順番に生成します。プログラミングでは多くの場面で番号を 0 から数え始めるため、range()0 から始まり、指定した数の手前までを生成します。

range() は開始値と終了値を指定することもできます。main.py に以下の内容を記述して実行してみましょう。

for i in range(1, 11):
    print(i)

実行すると以下のように出力されます。

1
2
3
4
5
6
7
8
9
10

range(1, 11) は 1 から始まり、11 の手前(つまり 10)までの数値を生成します。

さらに、3つ目の引数でステップ(刻み幅)を指定することもできます。main.py に以下の内容を記述して実行してみましょう。

for i in range(0, 11, 2):
    print(i)

実行すると以下のように出力されます。

0
2
4
6
8
10

range(0, 11, 2) は 0 から 10 まで、2 ずつ増やしながら数値を生成します。

📝 range関数の引数
range(終了値): 0から終了値-1まで。range(開始値, 終了値): 開始値から終了値-1まで。range(開始値, 終了値, ステップ): 開始値から終了値-1まで、ステップ刻み。終了値自体は含まれない点に注意してください。
💡 ポイント
while は「条件を満たす間ずっと繰り返す」ときに使います。繰り返す回数が事前に決まっていない場合に適しています。一方、for は「決まった回数」や「リストの要素を順番に処理する」ときに使います。迷ったときは、回数が決まっているなら for、条件次第で回数が変わるなら while と考えるとよいでしょう。
💡 ポイント
for ループは、ここで紹介した range() だけでなく、リスト辞書といったデータ構造と組み合わせることで、さらに便利に活用できます。リストや辞書については次の講座で詳しく解説します。

3.3 break と continue

ループ内での breakcontinue の動作の違いを以下の図に示します。

flowchart TD
    A(["ループ開始"]) --> B{"次の要素<br>があるか"}
    B -- "なし" --> H(["ループ終了"])
    B -- "あり" --> C["要素を取得"]
    C --> D{"break条件"}
    D -- "True" --> H
    D -- "False" --> E{"continue条件"}
    E -- "True" --> B
    E -- "False" --> F["通常の処理"]
    F --> B

ここからの例では、次の講座Pythonデータ構造で解説するリストを使用しています。リストは [10, 20, 30] のように複数の値をまとめて扱うデータ構造です。ここでは「複数の値を順番に処理している」という点だけ理解できれば問題ありません。

break(ループの中断)

break を使うと、ループを途中で中断して抜けることができます。基本的な構文は以下のとおりです。

for 変数名 in 繰り返し対象:
    if 条件式:
        break  # ループを中断して抜ける

ループ内で break が実行されると、その時点でループ全体が終了し、ループの次の行から処理が続行されます。

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

numbers = [10, 20, 30, 40, 50]

for num in numbers:
    print(f"{num} を確認中...")

    if num == 30:
        print(f"{num} が見つかりました。検索を中断します。")
        break

print("処理を終了しました")

実行すると以下のように出力されます。

10 を確認中...
20 を確認中...
30 を確認中...
30 が見つかりました。検索を中断します。
処理を終了しました

continue(スキップして次の繰り返しへ)

continue を使うと、現在の繰り返しをスキップして次の繰り返しに進むことができます。基本的な構文は以下のとおりです。

for 変数名 in 繰り返し対象:
    if 条件式:
        continue  # 以降の処理をスキップして次の繰り返しへ
    # continueが実行されると、ここはスキップされる

ループ内で continue が実行されると、その回の残りの処理をスキップし、次の繰り返しに進みます。break とは異なり、ループ自体は終了しません。

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

log_levels = ["INFO", "DEBUG", "ERROR", "INFO", "WARNING", "DEBUG", "ERROR"]

print("ERRORとWARNINGのログのみ表示:")
for level in log_levels:
    if level == "INFO" or level == "DEBUG":
        continue
    print(f"  [{level}] 要確認のログがあります")

実行すると以下のように出力されます。

ERRORとWARNINGのログのみ表示:
  [ERROR] 要確認のログがあります
  [WARNING] 要確認のログがあります
  [ERROR] 要確認のログがあります

whileループでのbreak活用

whileループと break を組み合わせることで、特定の条件を満たしたときにループを脱出するパターンがよく使われます。基本的な構文は以下のとおりです。

while True:
    # 繰り返す処理
    if 条件式:
        break  # 条件を満たしたらループを抜ける

while True で無限ループを作り、ループ内の break で条件に応じて脱出するという書き方は、実務でもよく使われるパターンです。

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。

import random

attempt = 0

while True:
    attempt += 1
    # 1〜6のランダムな値でサイコロをシミュレーション
    dice = random.randint(1, 6)

    if dice == 6:
        print(f"試行 {attempt}: 6が出ました!")
        break
    else:
        print(f"試行 {attempt}: {dice}が出ました。もう一度...")

print("ゲーム終了")

実行すると以下のように出力されます(ランダムなため、結果は毎回異なります)。

試行 1: 3が出ました。もう一度...
試行 2: 1が出ました。もう一度...
試行 3: 6が出ました!
ゲーム終了

random.randint(1, 6) で毎回ランダムにサイコロの値が決まり、6が出るまで while True でループが繰り返されます。6が出ると break でループを抜け、「ゲーム終了」が表示されます。ランダムなため、試行回数は実行するたびに変わります。

4. まとめ

この講座では、Pythonの制御構文について学びました。

  • if / elif / else で条件に応じた処理の分岐ができる
  • 比較演算子==, !=, <, >, <=, >=)で値の比較ができる
  • 条件式は最終的に 真偽値True / False)に評価される
  • and, or, not で複数の条件を組み合わせられる
  • whileループは条件が True の間、処理を繰り返す
  • forループrange() を使って指定した回数の繰り返し処理ができる
  • breakでループを中断し、continueで次の繰り返しにスキップできる