C
Python/入門/Lesson 05

制御フロー — if · for · while · 内包表記の基礎

30分·theory
このチャプター
4/7

制御フロー — if · for · while · 内包表記の基礎

🎯 このlessonを読んだら

このlessonを最後まで読むと、以下の3つを自信を持ってできるようになります。

  • ✅ インデントのルール (PEP 8 — スペース4つ)
  • ✅ enumerate · zip · range の正確な使い方
  • ✅ リスト内包表記 + 辞書内包表記

学習目標をチェックリストとして手元に置き、すべてに答えられるようになったらlessonを閉じてください。

if · elif · else — *条件分岐 + インデントのルール*

if / elif / else — 条件分岐の基本

python
score = 85

if score >= 90:
    grade = 'A'
elif score >= 80:    # else if ではなく elif (一単語)
    grade = 'B'
elif score >= 70:
    grade = 'C'
else:
    grade = 'F'

print(grade)   # 'B'   ← 85 は 80 以上なので二番目の分岐

基本ルール:

  • 条件行の末尾にコロン : が必須
  • 次の行はスペース4つのインデント (ブロック)
  • else if ではなく elif — Python独自の略記

比較演算子: == (等しい) / != (等しくない) / >= (以上) / <= (以下) / < / >


条件式 (三項演算子) — 1行のif

python
age = 28
label = '成人' if age >= 19 else '未成年'
print(label)   # '成人'

{値1} if {条件} else {値2} — JSの cond ? a : b と同じですが、順序が異なります (値が先)。


truthy / falsy — ifの隠れたルール

python
if x:            # x が truthy か (値が「あると認められるか」)
if not x:        # x が falsy か

Pythonのfalsy値7つ: 0, 0.0, '', None, False, [], {}, ()空のコレクションもfalsy

python
items = []
if items:                     # False — 空のリストはfalsy
    print('あり')
elif items is None:           # 明示的なNone検査 (PEP 8: == None より is None を推奨)
    print('未初期化')
else:
    print('空')         # ← これが出力される

インデントのルール — SyntaxError 第1位の原因

Pythonは { } の代わりにインデントの深さ でブロックを区切ります。深さが同じなら同じブロック。

python
if x > 0:
    print("正の数")          # 4スペースのインデント → ifブロック内
    print("二行目")    # 同じ深さ → 同じブロック
else:
    print("負の数または0")

よくあるエラー3つ

1. IndentationError: expected an indented block

python
if x > 0:
print("正の数")    # ❌ インデントなし

if の次の行は必ずインデントが必要。空ブロックには pass を使用:

python
if x > 0:
    pass        # ✅

2. IndentationError: unexpected indent

python
print("hello")
    print("world")   # ❌ 突然のインデント (ブロック開始キーワードなし)

3. タブとスペースの混在 — 見えないトラップ

python
def foo():
    print("a")    # スペース4つ
	print("b")    # タブ → エディタによって幅が異なって見える → バグ

PEP 8 標準: スペース4つ。エディタでTab → スペース4つに自動変換する設定を行いましょう。

for · while · range · enumerate · zip — *ループ全体*

基本のfor — 反復可能なオブジェクトの走査

python
for name in ['A', 'B', 'C']:
    print(name)

Javaの for(int i=0; i<n; i++) のようなインデックスベースのforはありません。インデックスは range() で生成します。

range() — 数値シーケンス

python
range(5)         # 0, 1, 2, 3, 4
range(2, 8)      # 2, 3, 4, 5, 6, 7
range(0, 10, 2)  # 0, 2, 4, 6, 8 (step)
range(10, 0, -1) # 10, 9, ..., 1 (逆順)

終端値は含まれません。Java/JSと同じ挙動。

python
for i in range(5):
    print(i)     # 0, 1, 2, 3, 4

enumerate() — インデックス + 値を同時に

python
names = ['A', 'B', 'C']
for i, name in enumerate(names):
    print(i, name)
# 0 A
# 1 B
# 2 C

for i, name in enumerate(names, start=1):    # 1から開始
    print(f'{i}. {name}')

インデックスが必要な場合はenumeraterange(len(arr)) はPythonicではありません。

zip() — 複数のシーケンスを同時に走査

python
names = ['A', 'B', 'C']
ages = [30, 25, 28]

for name, age in zip(names, ages):
    print(name, age)
# A 30
# B 25
# C 28

短い方を基準に自動的に停止します。2つのコレクションの対応する要素を処理するパターン。

while と break · continue

python
n = 0
while n < 10:
    if n == 5:
        break          # 即座にループ終了
    if n % 2 == 0:
        n += 1
        continue       # 次の繰り返しへ
    print(n)
    n += 1

for-else — 珍しい構文

python
for item in items:
    if item == target:
        print('見つかった')
        break
else:
    print('見つからなかった')    # *break に遭遇せず最後まで*ループが回ると実行

ループが正常終了したときにelseが実行されます。検索パターンに便利 — 他の言語にはないPython独自の機能。

リスト内包表記 — *Pythonらしさの象徴*

基本形

python
# 既存: for + append
squares = []
for x in range(10):
    squares.append(x ** 2)

# 内包表記
squares = [x ** 2 for x in range(10)]

4行 → 1行。AIが生成するPythonコードの半数以上がこの構文を使用しています。

条件フィルタの追加

python
even_squares = [x ** 2 for x in range(10) if x % 2 == 0]
# [0, 4, 16, 36, 64]

末尾のif — フィルタ。JSの .filter().map() を1行にまとめたようなものです。

ネストした内包表記

python
matrix = [[i * j for j in range(3)] for i in range(3)]
# [[0, 0, 0], [0, 1, 2], [0, 2, 4]]

複数のfor — 外側のforが外側のループ

辞書内包表記

python
squares = {x: x ** 2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

セット内包表記

python
unique_lengths = {len(name) for name in names}
# 重複が除去された長さ

可読性の限界

python
# ❌ 複雑すぎる — 通常のforで書き直してください
result = [
    process(x, y)
    for x in items
    for y in others
    if x.active and y.active and check(x, y)
]

2段階以上 + 複雑な条件の場合は通常のforの方が読みやすいです。内包表記は短い場合にのみ威力を発揮します。

🤖 AIにこう頼んでみましょう

  • 「このforループをリスト内包表記に変換して」
  • 「このenumerate + zipの組み合わせを一度に解いて」
  • 「このインデントエラーを直して」 (コード全体を一緒に送ると即座に解決できます)

🐍 試してみよう — if · for · while · 内包表記

制御フロー4種類を1つの画面で実験できます。スコアや条件を変えながら、出力の変化を確認してみてください。
✏️ Python 코드
📟 コンソール出力
▶ 実行ボタンを押してください
🐍 Pyodideで実際のPythonを実行 — 初回は読み込みに3〜5秒
先に読むとよい概念: リストを徹底攻略
次のおすすめ: 関数定義
制御フロー — if · for · while · 内包表記の基礎 - Python