制御構造——if/for/while で「条件と繰り返し」を扱う
レッスン3:制御構造——if/for/while で「条件と繰り返し」を扱う
このレッスンで学ぶこと
- 条件分岐(if/elif/else)の書き方を理解する
- 比較演算子と論理演算子を整理する
- 繰り返し(for と range、while)の使い分けを身につける
- ループの早期脱出(break、continue)を扱える
- ネストと可読性を保つ書き方を意識する
- 業務での典型的な条件分岐パターン(区分判定・閾値判定)を理解する
前回のレッスンでは、Python の変数とデータ型を扱いました。値を保管できるようになると、次に必要なのは「条件で分岐する」「処理を繰り返す」という発想です。本レッスンでは、Python の制御構造を、業務での典型例とともに扱います。
条件分岐——if/elif/else
最も基本的な制御構造が、条件分岐です。「ある条件が True なら A、そうでなければ B」を Python で書きます。
最小の if
score = 85
if 80 <= score:
print("合格")
if の後ろに条件式(80 <= score)を書き、コロン : で終え、次の行を字下げしてブロックを書きます。条件が True のときだけ、字下げされたブロックが実行されます。
else——「そうでなければ」
score = 65
if 80 <= score:
print("合格")
else:
print("不合格")
else: を使うと、条件が False のときの処理を書けます。
elif——「ほかの条件を順に判定」
複数の条件を順に判定したいときは、elif(else if の短縮)を使います。
score = 75
if 80 <= score:
print("A")
elif 70 <= score:
print("B")
elif 60 <= score:
print("C")
else:
print("D")
if・elif・elif・…・else の順で書き、上から順番に条件が判定されます。最初に True になったブロックだけが実行され、それ以降の条件は判定されません。
制御フローを図で
flowchart TD
A["if 条件1"] -->|True| B["処理 A"]
A -->|False| C["elif 条件2"]
C -->|True| D["処理 B"]
C -->|False| E["else"]
E --> F["処理 C"]
B --> G["次の処理へ"]
D --> G
F --> G
💡 ポイント 条件分岐は
if・elif・elseで書きます。上から順に判定され、最初に True になったブロックだけが実行されます。elifは何個でも並べられます。
比較演算子
条件式で使う「比較演算子」を整理します。
| 演算子 | 意味 | 例 |
|---|---|---|
== |
等しい | score == 100 |
!= |
等しくない | name != "" |
< |
より小さい | age < 20 |
<= |
以下 | score <= 100 |
> |
より大きい | count > 0 |
>= |
以上 | temp >= 30 |
注意点として、「等しい」は ==(イコール 2 つ)です。=(1 つ)は代入なので、混同するとエラーや誤動作の原因になります。
Python ならではの便利な書き方
Python では、不等号を続けて書ける「区間判定」が許されています。
score = 75
if 60 <= score < 80: # 60 以上 80 未満
print("中位")
数学の式に近い形で書けるので、Excel の AND 関数に近い読みやすさになります。
💡 ポイント 比較演算子は
==・!=・<・<=・>・>=の 6 つ。「等しい」は==(イコール 2 つ)であり、代入の=と混同しないこと。60 <= score < 80のような区間判定も書けます。
論理演算子
複数の条件を組み合わせるときは、論理演算子を使います。
| 演算子 | 意味 | 例 |
|---|---|---|
and |
かつ(両方が True) | age >= 18 and is_member |
or |
または(どちらかが True) | is_admin or is_owner |
not |
否定(True と False を反転) | not is_paid |
age = 25
is_member = True
if 18 <= age and is_member:
print("入場できます")
Python では && ではなく and、|| ではなく or、! ではなく not を使います。英語の意味に近い書き方が、Python らしさです。
「短絡評価」
and と or には「短絡評価」のクセがあります。
A and B:Aが False ならBは評価されない(False が確定するから)A or B:Aが True ならBは評価されない(True が確定するから)
実用上は、副作用のある関数を and / or の右辺に書かない、というのを意識しておけば十分です。
💡 ポイント 論理演算子は
and・or・notの 3 つ。Python は記号(&&・||・!)ではなく英単語を使うのが特徴です。
繰り返し——for と range
「同じ処理を繰り返す」のが繰り返し(ループ)です。Python の主役は for ループです。
range で「N 回繰り返す」
for i in range(5):
print(i)
実行すると、次のように表示されます。
0
1
2
3
4
range(5) は「0 から始めて 5 の手前まで」を順に生成します。i という変数に、0、1、2、3、4 が順に入り、print が 5 回呼ばれます。
range の引数バリエーション
for i in range(1, 6): # 1 から 5
print(i) # 1、2、3、4、5
for i in range(0, 10, 2): # 0 から 8 まで 2 ずつ
print(i) # 0、2、4、6、8
for i in range(10, 0, -1): # 10 から 1 まで降順
print(i) # 10、9、8、… 1
range(start, stop, step) の 3 引数で、開始・終了の手前・刻みを指定できます。
リストや文字列を繰り返す
for はリスト(次回扱う)や文字列も繰り返せます。
names = ["山田", "鈴木", "佐藤"]
for name in names:
print(f"{name}さん")
for char in "Python":
print(char)
for の本質は「集まりの中の要素を 1 つずつ取り出して処理する」発想です。
💡 ポイント 繰り返しは
forが主役。range(N)で「N 回繰り返す」、range(start, stop, step)で開始・終了の手前・刻みを指定。リストや文字列もforで 1 要素ずつ取り出せます。
while ループ
for が「集まりを順に処理する」のに対し、while は「条件が True の間、繰り返す」発想です。
count = 0
while count < 5:
print(count)
count = count + 1
実行すると 0 から 4 までが順に表示されます。
while の使いどころ
- 回数が事前に決まらない場合
- 「ユーザーが終了と入力するまで」「条件を満たすまで」のような処理
total = 0
while total < 100:
total = total + 10
print(total)
無限ループに注意
while は条件の更新を忘れると、永遠に止まらない「無限ループ」になります。
# 危険な例(無限ループ)
count = 0
while count < 5:
print(count)
# count = count + 1 を忘れている
業務スクリプトで while を使うときは、終了条件が必ず満たされるかを確認します。Google Colab で無限ループに陥ったときは、停止ボタンで実行を止められます。
💡 ポイント
whileは「条件が True の間、繰り返す」ループ。回数が事前に決まらない場合に使います。終了条件の更新を忘れると無限ループになるので注意します。
break と continue——ループの早期脱出
ループ中に「ここで抜けたい」「ここはスキップしたい」というときに使うのが break と continue です。
break——ループを抜ける
for number in range(1, 100):
if number == 5:
break
print(number)
実行すると、1、2、3、4 が表示され、5 のところで break でループを抜けます。
業務では「条件に合うデータが見つかったら、それ以上探さない」場面で使います。
continue——今の周回をスキップして次へ
for number in range(1, 6):
if number == 3:
continue
print(number)
実行すると、1、2、4、5 が表示されます(3 だけスキップ)。
業務では「特定の条件のデータは飛ばして、ほかを処理する」場面で使います。
💡 ポイント
breakは「ループを抜ける」、continueは「今の周回をスキップして次の周回へ」。どちらも条件付き(ifの中)で使うのが定番です。
ネストと可読性
if の中に for、for の中に if というように、制御構造は入れ子(ネスト)にできます。ただし、ネストが深くなると読みにくくなります。
ネストの例
for student in students:
if student["score"] >= 80:
if student["attendance"] >= 0.9:
print(f"{student['name']}:合格")
else:
print(f"{student['name']}:要面談")
ネストを浅くするコツ
ネストが 3 段以上深くなったら、continue や関数の分割(次のレッスン 5 で扱う)で浅くする工夫をします。
# 早期 continue でネストを浅くする
for student in students:
if student["score"] < 80:
continue
if student["attendance"] < 0.9:
print(f"{student['name']}:要面談")
continue
print(f"{student['name']}:合格")
「読みやすさを最優先」が Python の発想だったことを思い出します。ネストを浅く保つ工夫は、業務で長く使われるコードに必須の意識です。
💡 ポイント 制御構造はネストできますが、深くなると読みにくくなります。
continueで早期脱出する、関数に分割するなどの工夫で、ネストを浅く保ちます。
業務での典型パターン
実務で「これは Python で書く価値がある」と判断できる典型パターンを、3 つに整理します。
パターン 1:区分判定
「点数を A/B/C にランク分けする」「金額を等級分けする」のような区分判定は、if/elif/else の典型例です。
score = 75
if 90 <= score:
grade = "A"
elif 80 <= score:
grade = "B"
elif 70 <= score:
grade = "C"
elif 60 <= score:
grade = "D"
else:
grade = "F"
print(f"スコア {score} は {grade} 評価")
パターン 2:閾値判定
「在庫が一定を下回ったら発注」「気温が 30 度を超えたらアラート」のような閾値判定も典型です。
stock = 8
threshold = 10
if stock < threshold:
print(f"在庫{stock}個。{threshold}個未満のため、発注が必要")
else:
print(f"在庫{stock}個。十分な在庫があります")
パターン 3:複数の繰り返し処理
「100 件のデータを順に処理し、条件に合うものだけ集計する」のような繰り返しと条件の組み合わせは、Python が真価を発揮する場面です。
prices = [1000, 2500, 800, 4500, 1200, 3300, 700]
total = 0
count = 0
for price in prices:
if 1000 <= price:
total = total + price
count = count + 1
print(f"1000 円以上のものは {count} 件、合計 {total} 円")
これらの典型パターンは、Excel の関数では書きにくい・遅い処理を、Python なら数行で書けるものです。
💡 ポイント 業務での典型は「区分判定」「閾値判定」「複数の繰り返し処理」の 3 パターン。Excel で書きづらい処理ほど、Python に置き換える価値があります。
講師の現場メモ:「Excel の IF が 10 段ネストしていたシートを、Python で書き直した日」
私(平野)が、IT コンサル時代に担当した、ある中堅小売業の事例です。月次の販売報告書を Excel で作っている社員の方から、「IF 関数が深すぎて、誰も触れなくなった」と相談を受けました。
そのシートを開いてみると、確かにすごいことになっていました。「店舗の規模」「曜日」「天気」「セール期間」「会員ステータス」「決済方法」の 6 条件を組み合わせて、24 種類のカテゴリに分類する関数式が、1 つのセルに入っていました。長さは 800 文字、ネストした IF が 10 段以上、AND と OR が組み合わさり、行が折り返して 4 行にわたっています。当時の担当者の方は、退職されていました。「何が書いてあるか、もう誰もわからない。けれども毎月使わないといけない」と、現任の方は困っていました。
私はこの IF 関数を Python で書き直す提案をしました。30 分ほど現任の方と話して、6 条件の組み合わせを整理し、次のような Python の関数にまとめました(次のレッスン 5 で扱う関数構文を、先取りで載せます)。
def classify_sale(store_size, weekday, weather, is_sale, member_status, payment):
# 大型店の処理
if store_size == "大型":
if is_sale:
return "大型_セール"
if weather == "雨":
return "大型_雨天"
return "大型_通常"
# 中型店の処理
if store_size == "中型":
if is_sale and weekday == "土日":
return "中型_セール土日"
if is_sale:
return "中型_セール平日"
return "中型_通常"
# 小型店の処理
if is_sale:
return "小型_セール"
return "小型_通常"
書き直したコードは 20 行ほど。Excel の関数式と比べて、5 倍は読みやすくなりました。各分岐に名前(コメントや条件式)が付いているので、「大型店の処理」「中型店のセール処理」と上から追えるのです。
このコードを使って、CSV ファイルから 1 行ずつ読み、classify_sale を呼んで結果を出力するスクリプトを作りました。月次の集計時間は、Excel で 2 時間かかっていたものが、Python で 8 秒になりました。
このときに改めて感じたのは、Python の if/elif/else は「Excel の IF の代替」ではなく「業務ロジックを言葉で書ける表現方法」だ、ということです。Excel の IF は数式の中に閉じ込められて読みにくくなりますが、Python なら 1 つの分岐を 1 行で書き、コメントを添え、変数名で意図を伝えられます。「読める手を育てる」「半年後の自分が読み直せるコード」を意識すると、業務ロジックの可視化と継承が、ぐっと楽になります。本コースで if/elif/else を扱うのは、皆さんに業務ロジックを言葉で書く力を持ち帰ってほしいからです。
まとめ
このレッスンでは、以下のことを学びました。
- 条件分岐は
if・elif・else。上から順に判定され、最初に True になったブロックだけが実行される - 比較演算子は
==・!=・<・<=・>・>=の 6 つ。==(等しい)と=(代入)の混同に注意 - 論理演算子は
and・or・not。記号ではなく英単語を使うのが Python らしさ - 繰り返しは
forが主役。range(N)、range(start, stop, step)で柔軟に制御。リストや文字列も対象になる whileは「条件が True の間繰り返す」ループ。終了条件の更新を忘れると無限ループにbreakでループを抜ける、continueで今の周回をスキップして次へ- ネストが深くなったら
continueの早期脱出や関数の分割で浅く保つ - 業務典型は「区分判定」「閾値判定」「複数の繰り返し処理」の 3 パターン
次のレッスンでは、Python のデータ構造を扱います。リスト・タプル・辞書・集合の 4 つを比べながら、業務でのデータ表現と、リスト内包表記の便利な書き方を学びます。
確認クイズ
このレッスンの理解度をチェックしましょう。