第1部 Python基礎編
第3章 制御構文 — if・for・while
「条件によって処理を変える」「同じ処理を繰り返す」。この2つができると、プログラムは一気に実用的になります。
🎯 この章で学ぶこと
if/elif/elseによる条件分岐- インデント(字下げ)というPythonの最重要ルール
forとwhileによる繰り返しbreak/continueによるループ制御
3.1 if文 — 条件で処理を分ける
ログイン失敗回数に応じて対応を変える、という実務っぽい例で見てみましょう。
# login_check.py
failed_attempts = 6
if failed_attempts >= 10:
print("アカウントをロックします")
elif failed_attempts >= 5:
print("警告: 失敗が多すぎます。管理者に通知します")
else:
print("正常範囲内です")
$ python login_check.py
警告: 失敗が多すぎます。管理者に通知します
ポイントは3つです。
- 条件の行の末尾に コロン
:を付ける - 条件が成立したときに実行する行はインデント(半角スペース4つ)で下げる
- 上から順に評価され、最初に成立した1つだけが実行される
多くの言語では字下げは見た目の問題ですが、Pythonではインデントそのものがブロック構造を決めます。ズレるとエラー(IndentationError)になるか、もっと悪いことに「エラーにならず意図と違う動きをする」ことがあります。歴史的に有名なAppleの「goto fail」脆弱性(2014年)は、ブロック構造の見落としが原因でTLS証明書検証がスキップされるというものでした。ブロックがどこからどこまでかを常に意識する習慣は、そのままセキュアコーディングの習慣です。
条件の組み合わせ — and・or・not
hour = 23
is_admin = False
# 深夜のアクセス、かつ管理者でない → 要注意
if hour >= 22 and not is_admin:
print("深夜の一般ユーザーアクセスを記録します")
# どちらか一方でも成立すればTrue
if hour < 6 or hour >= 22:
print("業務時間外のアクセスです")
3.2 for文 — 決まった回数・要素の数だけ繰り返す
for は「リストなどの要素を1つずつ取り出しながら繰り返す」構文です。
servers = ["web-01", "web-02", "db-01"]
for server in servers:
print(f"{server} の死活監視を実行します")
web-01 の死活監視を実行します
web-02 の死活監視を実行します
db-01 の死活監視を実行します
回数を決めて繰り返したいときは range() を使います。
for i in range(3): # 0, 1, 2 と変化する
print(f"{i + 1} 回目の試行")
1 回目の試行
2 回目の試行
3 回目の試行
range(3) は 0, 1, 2 を生成します(3は含まない)。「0から数え始める」のはプログラミング全般の共通ルールです。range(1, 4) と書けば 1, 2, 3 になります。
3.3 while文 — 条件が成立している間、繰り返す
「何回繰り返すか事前にわからない」ときは while を使います。
# password_prompt.py — 3回まで再入力を許すパスワード確認(教材用)
CORRECT = "sakura-mochi-2026"
attempts = 0
while attempts < 3:
entered = input("合言葉を入力: ")
if entered == CORRECT:
print("認証成功")
break # ループを途中で抜ける
attempts = attempts + 1
print(f"違います(残り {3 - attempts} 回)")
else:
# breakされずにループが終わった時だけ実行される
print("試行回数を超えました。ロックします")
ここで登場した2つのキーワードを整理します。
break— ループをその場で終了するcontinue— その回の残りをスキップして次の繰り返しへ進む
while True: のように常に成立する条件を書き、break を忘れるとプログラムは永遠に止まりません(Ctrl+C で強制終了できます)。意図しない無限ループはCPUを使い果たし、サービス停止(可用性の喪失=セキュリティ3要素の1つの侵害)につながります。
3.4 実践 — ログの中から失敗だけを数える
この章の内容を組み合わせると、もう「ログ解析の原型」が書けます。
# count_failed.py
logs = [
"09:00:01 LOGIN OK user=tanaka",
"09:00:15 LOGIN FAILED user=admin",
"09:00:18 LOGIN FAILED user=admin",
"09:01:02 LOGIN OK user=suzuki",
"09:01:30 LOGIN FAILED user=root",
]
failed_count = 0
for line in logs:
if "FAILED" in line:
failed_count = failed_count + 1
print(f"[警告] {line}")
print(f"ログイン失敗は合計 {failed_count} 件でした")
[警告] 09:00:15 LOGIN FAILED user=admin
[警告] 09:00:18 LOGIN FAILED user=admin
[警告] 09:01:30 LOGIN FAILED user=root
ログイン失敗は合計 3 件でした
3.3のプログラムで書いた「3回失敗したらロック」は、実際の認証システムに必ず入っているブルートフォース攻撃(総当たり攻撃)対策そのものです。攻撃者はプログラムでパスワードを機械的に試し続けます。回数制限・ロックアウト・待ち時間の挿入といった対策は、すべて今日学んだ「カウンタ変数 + if + ループ」でできています。基礎文法がそのまま防御技術になる好例です。
まとめ
if / elif / elseで条件分岐。コロンとインデントを忘れずに- インデントはPythonの文法そのもの。ブロックの範囲を常に意識する
- 要素を順に処理するなら
for、条件で回し続けるならwhile breakで脱出、continueでスキップ
練習問題
変数 port に数値を入れ、「80か443なら『Web用ポート』、22なら『SSH用ポート』、それ以外なら『その他のポート』」と表示するプログラムを書いてください。
解答を見る
port = 443
if port == 80 or port == 443:
print("Web用ポート")
elif port == 22:
print("SSH用ポート")
else:
print("その他のポート")
for と range() を使って、1から100までの合計を計算して表示してください。
解答を見る
total = 0
for i in range(1, 101): # 1〜100(101は含まない)
total = total + i
print(total) # 5050
3.4のログ解析プログラムを改造して、「user=admin の失敗だけ」を数えるようにしてください。管理者アカウントへの攻撃は特に重要な監視対象です。
解答を見る
admin_failed = 0
for line in logs:
if "FAILED" in line and "user=admin" in line:
admin_failed = admin_failed + 1
print(f"adminへのログイン失敗: {admin_failed} 件") # 2 件
条件を and でつなぐだけで「絞り込み」ができます。実際のSIEM(ログ監視システム)がやっていることの原理はこれと同じです。