# Python 定型パターン辞書

**引く方向が教科書と逆です。** 教科書は「`%` とは何か」から引きますが、この辞書は「余りで循環させたい」から引きます。書けるようになるには、意味 → 記号ではなく、**やりたいこと → 形**の順で覚える必要があるからです。

掲載コードはすべて実際に実行して出力を確認済み。

---

## 1. 繰り返しの4形

### データの個数だけ繰り返す（中身はいらない）

```python
data = ['x', 'y', 'z']
for _ in range(len(data)):
    print('-', end='')
# ---
```

`_` は「受け取るが使わない」という合図。回数だけが必要なときに使う。

**効く場面** 入力の量が実行ごとに変わるとき。`for _ in range(3)` と固定で書くと、データが4件になった瞬間に壊れる。`len(data)` にしておけば自動で追従する。

### 要素そのものが欲しい

```python
for score in [80, 95, 60]:
    print(score)
```

**効く場面** 9割はこれ。添字が不要なら `range(len(...))` を経由しない。

### 番号も欲しい

```python
for i, x in enumerate(['a', 'b'], 1):
    print(f'{i}. {x}')
# 1. a
# 2. b
```

**効く場面** 「1.」「2.」と番号を振る、何番目で見つかったかを記録する。第2引数で開始番号を指定できる。

### 終わりが決まっていない

```python
nums = [3, 0, 5]
i = 0
while True:
    if i >= len(nums) or nums[i] == 0:
        break
    print(nums[i])
    i += 1
```

**効く場面** 入力待ち、終了条件が複数ある、ゲームのメインループ。`while True` + `break` は「途中で抜ける」を素直に書ける形。

---

## 2. 数を扱う

### 偶数・奇数

```python
n = 7
print('偶数' if n % 2 == 0 else '奇数')   # 奇数
```

**効く場面** 交互に色を変える、2人で交代する、行の縞模様。

### 何個とれるか、いくつ余るか

```python
total, size = 17, 5
print(total // size, total % size)   # 3 2
```

**効く場面** 箱詰め、ページ分割、時間の分秒変換（`sec // 60`, `sec % 60`）。この2つは常にセットで出てくる。

### 添字を循環させる

```python
names = ['A', 'B', 'C']
for i in range(5):
    print(names[i % len(names)])   # A B C A B
```

**効く場面** プレイヤーの手番送り、色のローテーション、曲のループ再生。`if i >= len: i = 0` と書くより短く、範囲外エラーが原理的に起きない。

### 切り上げ割り算

```python
a, b = 17, 5
print(-(-a // b))   # 4
```

**効く場面** 「17人を5人ずつの班に → 何班必要か」。3.4班では足りないので4。`math.ceil` を import せずに済む定番のトリック。

### 平方根・累乗

```python
print(9 ** 0.5, 2 ** 10)   # 3.0 1024
```

**効く場面** 2点間の距離、面積、容量計算。0.5乗が平方根。

### 桁を切る

```python
print(1234 % 100, 1234 // 100)   # 34 12
```

**効く場面** 下2桁だけ取り出す、金額を千円単位にする、時刻の分解。

---

## 3. 判定

### 範囲内か（and を使わない）

```python
a = [1, 2, 3]
i = 5
print('OK' if 0 <= i < len(a) else '範囲外')   # 範囲外
```

**効く場面** 配列アクセスの直前、座標が盤面内か、入力値の検証。`i >= 0 and i < len(a)` と同じだが、読む速度が違う。

### 含まれるか

```python
word = 'python'
print(sum(1 for c in word if c in 'aeiou'))   # 1
```

**効く場面** 母音を数える、禁止語チェック、辞書にキーがあるか。`in` は文字列・リスト・辞書すべてで使える。

### 空なら既定値

```python
s = ''
print(s or '匿名')   # 匿名
```

**効く場面** 未入力のときの表示名、設定ファイルの省略値。`or` は True/False ではなく**値そのもの**を返す。

**落とし穴** `n or 10` は `n = 0` のときも `10` を返す。0 を有効な値として扱いたいなら `n if n is not None else 10` と書く。

### 存在確認してから中身を見る

```python
s = ''
print(bool(s and s[0] == 'a'))   # False
```

**効く場面** 空リストの1件目を触る前。`and` は左が偽なら右を**評価しない**ので、`s[0]` のエラーが起きない。順番を逆にすると落ちる。

### 見つかったかどうかを記録する

```python
nums = [4, 7, 9]
found = False
for n in nums:
    if n % 7 == 0:
        found = True
        break
print(found)   # True
```

**効く場面** 探索全般。`found` フラグ + `break` は、ループを抜けた後に「あったのか」を判定するための基本形。

---

## 4. 文字列

### 区切り線

```python
print('-' * 20)   # --------------------
```

**効く場面** コンソール出力の整形。見出しの下、集計の区切り。

### 文字で棒グラフを描く

```python
for name, v in [('A', 7), ('B', 3)]:
    print(f'{name} {"#" * v}{v:>3}')
# A #######   7
# B ###   3
```

**効く場面** ライブラリなしでデータの形を見る。`'#' * v` の繰り返しと、`:>3` の右寄せの合わせ技。

### 値を埋めて整形する

```python
print(f'{3.14159:.2f} / {42:>5} / {7:03}')   # 3.14 /    42 / 007
```

**効く場面** 小数2桁（`.2f`）、桁揃え（`>5`）、ゼロ埋め（`03`）。表を作るとき必須。

---

## 5. 集計

### 合計と平均

```python
scores = [80, 95, 60]
t = 0
for s in scores:
    t += s
print(t, round(t / len(scores), 1))   # 235 78.3
```

**効く場面** 集計処理の原型。`+=` が「貯める」動きそのもの。`sum(scores)` で済む場面も多いが、条件付き集計は手で書く。

### 結果を溜めていく

```python
lst = []
for i in range(3):
    lst += [i * i]
print(lst)   # [0, 1, 4]
```

**効く場面** 加工した結果を集める。`lst += [x]` は `lst.append(x)` と同じ。右辺をリストにするのを忘れると文字列がバラバラに入る。

### 出現回数を数える

```python
d = {}
for c in 'abca':
    d[c] = d.get(c, 0) + 1
print(d)   # {'a': 2, 'b': 1, 'c': 1}
```

**効く場面** 文字・単語の頻度、投票の集計。`get(c, 0)` が「初回は0として扱う」を1行で書く定型。

### 重複を除く

```python
seen = []
for x in [1, 2, 1]:
    if x not in seen:
        seen += [x]
print(seen)   # [1, 2]
```

**効く場面** 初出だけ処理する、履歴の重複排除。`not in` + `+=` の組み合わせ。

---

## 6. 知らないと必ず踏む3つ

```python
print(-7 // 2, -7 % 2)   # -4 1
```

負の数の `//` は**0方向ではなく小さい方**に切り捨てる。`%` の結果の符号は右側に従う。C言語やJavaと答えが違うので、他言語経験者ほど間違える。

```python
print(2 ** 3 ** 2)   # 512
```

`**` だけ**右から**計算する。`(2**3)**2 = 64` ではない。

```python
print(0.1 + 0.2 == 0.3)   # False
```

小数の `==` 比較は信用できない。`abs(a - b) < 1e-9` で比べる。

---

## 使い方

引き出しにするには、読むだけでは足りません。**やりたいこと（見出し）だけを見て、コードを手で再現できるか**を確認してください。できなかった項目が、ドリルに入れるべき問題です。
