はじめに
こんにちは!Python学習に励む皆さんの並走者として、今日も学習記録をお届けします。
現在、Udemyの「現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」(講師:酒井潤さん)を受講中です。今日は5日目。テーマは「コレクション型の使い分け」、具体的にはタプル・辞書・集合(set)の3つを学びました。
今日学んだこと
- タプル型の特徴と使い所
- アンパッキングを使った変数操作
- 辞書型のメソッド一覧
- 辞書のコピーと参照渡しの罠
- 集合型の演算と活用シーン
1. タプル型
タプルはリストに似ていますが、一度作ったら中身を変更できないデータ型です。
# タプルの基本
my_tuple = (1, 2, 3)
print(my_tuple[0]) # インデックスは使える → 1
# 追加はできない(エラーになる)
# my_tuple.append(4) # AttributeError!
💡 ポイント:カンマがタプルを作る
() があってもなくても、カンマ(,)があればタプルになります。
a = (1) # これはただの整数
b = (1,) # これがタプル
c = 1, # ()なしでもカンマがあればタプル
print(type(a)) # <class 'int'>
print(type(b)) # <class 'tuple'>
print(type(c)) # <class 'tuple'>
要素を追加したい場合は、タプルを作り直す必要があります。
my_tuple = (1, 2, 3)
my_tuple = my_tuple + (4,) # 作り直すことで「追加」は可能
print(my_tuple) # (1, 2, 3, 4)
2. タプルのアンパッキング
アンパッキングとは、タプルの要素を複数の変数に一度に割り当てる機能です。
num_tuple = (1, 2)
a, b = num_tuple
print(a, b) # 1 2
変数の入れ替えに使う
変数の値を交換するとき、従来は一時変数(tmp)が必要でした。
# 一時変数を使った方法(冗長)
x = 100
y = 200
tmp = x
x = y
y = tmp
print(x, y) # 200 100
アンパッキングを使うと、たった1行で書けます。
# アンパッキングを使った方法(スッキリ!)
x = 100
y = 200
x, y = y, x
print(x, y) # 200 100
⚠️ 多すぎる変数の同時宣言には注意
a, b, c, d, e = 1, 2, 3, 4, 5 # 書けるけど読みにくい
# 変数が多い場合はそれぞれ宣言したほうが分かりやすい
a = 1
b = 2
アンパッキングは「少数の変数の入れ替え」に活かすのがベストです。
3. タプルの使い所
「変更されたくないデータ」を守るのがタプルの真価です。
たとえばクイズシステムで、問題リストと回答リストを扱う場合を考えます。
# リストを使った場合(危険)
choose_question = [1, 2, 3]
answer = []
choose_question.append(1) # 問題リストに誤って追加してもエラーが出ない!
# タプルを使った場合(安全)
choose_question = (1, 2, 3)
answer = []
answer.append(1) # 回答リストへの追加はOK
answer.append(2)
# choose_question.append(4) # これはエラーになる → バグを早期発見できる!
💡 「変えてはいけないデータ」にタプルを使うことで、意図しない変更をエラーとして検知できるのが最大のメリットです。
4. 辞書型のメソッド
辞書型はキーと値のペアでデータを管理します。主なメソッドをまとめます。
person = {'name': 'Alice', 'age': 20}
# keys / values:キーや値の一覧を取得
print(person.keys()) # dict_keys(['name', 'age'])
print(person.values()) # dict_values(['Alice', 20])
# get:値の取得
print(person.get('name')) # Alice
# update:値の変更・追加
person.update({'age': 21, 'city': 'Tokyo'})
print(person) # {'name': 'Alice', 'age': 21, 'city': 'Tokyo'}
# in:キーの存在確認
print('name' in person) # True
# pop / del:値の削除
person.pop('city')
del person['age']
print(person) # {'name': 'Alice'}
# clear:中身を空にする
person.clear()
print(person) # {}
5. 辞書のコピー
辞書をそのまま代入すると「参照渡し」になり、片方を変更するともう片方も変わってしまいます。
# 参照渡し(危険)
original = {'a': 1}
copy = original
copy['a'] = 999
print(original) # {'a': 999} ← 元データも変わってしまう!
# .copy() を使った正しいコピー
original = {'a': 1}
copy = original.copy()
copy['a'] = 999
print(original) # {'a': 1} ← 元データは守られる
print(copy) # {'a': 999}
⚠️ 辞書を別の変数に渡すときは、常に .copy() を意識する習慣をつけましょう。
6. 辞書の使い所
辞書の大きな強みは検索速度の速さです。
# リストで検索(遅い:全件走査が必要)
users = ['Alice', 'Bob', 'Carol']
print('Bob' in users) # True だが内部的に先頭から探す
# 辞書で検索(速い:キーで直接アクセス)
user_dict = {'Alice': 1, 'Bob': 2, 'Carol': 3}
print('Bob' in user_dict) # True(ハッシュで即座にアクセス)
データ量が多いほど辞書の速度優位性が際立ちます。
7. 集合型(set)
集合型は重複のないデータの集まりを扱います。演算が強力です。
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b) # {3, 4} ← かつ(積集合)
print(a | b) # {1, 2, 3, 4, 5, 6} ← または(和集合)
print(a ^ b) # {1, 2, 5, 6} ← どちらか一方にしかない(排他的論理和)
集合のメソッド
my_set = {1, 2, 3}
my_set.add(4) # 追加 → {1, 2, 3, 4}
my_set.remove(2) # 削除 → {1, 3, 4}
my_set.clear() # 空にする → set()
print(my_set) # set()
集合の使い所
リストから重複を取り除いてユニークな種類だけ取り出すのに便利です。
access_log = ['Python', 'Java', 'Python', 'Ruby', 'Java', 'Python']
unique_languages = set(access_log)
print(unique_languages) # {'Python', 'Java', 'Ruby'}
📝 理解度チェック:Claudeに確認テストをやってみた
今日の学習内容がちゃんと身についているか、Claudeに確認テストを作ってもらいました。
テスト結果
| 項目 | 結果 |
|---|---|
| 正解数 | 8 / 10 |
| 正答率 | 80% |
💡 同じ立場の方へ:学習後すぐにテストするのは記憶の定着に効果的だと思いました!
Claudeに「〇〇についての確認テストを作って」と頼むだけで作ってくれます。
感想
今日の学習で一番印象に残ったのは、タプルを使う目的です。最初は「リストで全部解決できるのでは?」と思っていたのですが、「変えてはいけないデータにタプルを使うことで、バグを早期発見できる」という考え方がとても腑に落ちました。型を選ぶこと自体が、コードの意図を伝える手段になるんですね。
アンパッキングによる変数の入れ替え(x, y = y, x)も「なんでこれで動くんだ!」と感動しました。一時変数(tmp)を書いていた自分が懐かしく感じるくらい、スッキリした書き方です。
確認テストは10問中8問正解でした。間違えた問題はタプルの基本的な説明と、辞書に存在しないメソッドを選ぶ問題でした。どちらも「なんとなく理解した気になっていた」箇所だったので、テストのおかげで曖昧な部分が明確になりました。明日も引き続き頑張ります!
参考教材
この記事はUdemyの以下のコースを受講しながら学んだ内容を、自分の言葉でまとめたものです。
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル(講師: 酒井潤)