この記事は、エンジニアとしてキャリアチェンジや再学習(リスキリング)を目指す社会人のための Python 基礎学習記録 です。
筆者自身、現場経験はあるものの CS の基礎やアルゴリズム・データ構造の理解が浅く、その土台を作るべく記録していきます。
🎯 目的
- データ構造(List / Set)の理解
- イテレータ / ジェネレータの基本理解と活用
- Python の繰り返し処理を基礎から見直す
- 基礎的なコードを複数の方法で書き直して構文と概念を定着
🔰 List(リスト)
リストは順序付きの可変データ構造。重複を許す。
fruits = ["apple", "banana", "apple"]
print(fruits[0]) # 出力: apple
🔰 Set(集合)
セットは順序なしかつ重複しないデータ構造。
fruits = ["apple", "banana", "apple"]
unique = set(fruits)
print(unique) # 出力例: {'banana', 'apple'}
順序は保証されない点に注意。
🔁 リストから重複を除き、元の順序を保持する
✅ 入力と出力の例
words = ["apple", "banana", "apple", "orange", "banana"]
# 出力: ['apple', 'banana', 'orange']
✅ 解法①: for + set
def filter_unique(seq):
seen = set()
result = []
for item in seq:
if item not in seen:
seen.add(item)
result.append(item)
return result
print(filter_unique(words))
✅ 解法②: リスト内包表記 + 論理演算
def filter_unique(seq):
seen = set()
return [x for x in seq if not (x in seen or seen.add(x))]
print(filter_unique(words))
❓ 理解チェック:set([])
と set()
の違い
- どちらも空集合を生成する(実質同じ)
-
set([])
はリストから生成、set()
は空集合を直接生成(好ましい)
🔁 not in seen
を別の書き方にできるか?
if item not in seen:
...
- 明示的な代替案は
if not (item in seen)
。可読性を優先してnot in
を使うのが一般的。
⚙️ seq
ってなに?
- 通常
sequence
(配列的なもの)の略称 - リストや文字列、タプルなどを指す汎用引数名
❌ 間違った例と修正
def filter_unique(seq):
seen = set()
for item in seq:
if item not in seen:
result_word.append(item)
seen.add(item)
result = list(filter_unique(words))
🔻 問題点
-
result_word
が定義されていない -
filter_unique
がreturn
を持たない
✅ 修正後
def filter_unique(seq):
seen = set()
result = []
for item in seq:
if item not in seen:
result.append(item)
seen.add(item)
return result
result = filter_unique(words)
print(result)
🧠 ローカル変数 vs グローバル変数
x = "global"
def foo():
x = "local"
print(x) # 出力: local
foo()
print(x) # 出力: global
- 関数内の変数は ローカル変数
- 外で定義された変数は グローバル変数
⚙️ ジェネレータと yield の活用
🎯 演習:1〜10 の偶数だけを yield
する
def even_numbers():
for num in range(1, 11):
if num > 0 and num % 2 == 0:
yield num
for num in even_numbers():
print(num)
⚙️ イテレータとは?
nums = [1, 2, 3]
it = iter(nums)
print(next(it)) # 1
print(next(it)) # 2
✅ 定義:
-
next()
で1つずつ要素を取り出せるオブジェクト -
for
文の裏側で使われている
🔢 ビット演算子のまとめ
演算子 | 名称 | 例 |
---|---|---|
& |
AND |
5 & 3 → 1
|
` | ` | OR |
^ |
XOR |
5 ^ 3 → 6
|
~ |
NOT |
~5 → -6
|
<< |
左シフト |
1 << 2 → 4
|
>> |
右シフト |
4 >> 1 → 2
|
🧪 Day1 総まとめ:演習パターン集
✅ 演習①:リストから重複を除去し順序を保持(2パターン)
入力
words = ["dog", "cat", "dog", "fish"]
出力
["dog", "cat", "fish"]
解法1: for 文
def dedup(seq):
seen = set()
result = []
for item in seq:
if item not in seen:
result.append(item)
seen.add(item)
return result
解法2: 内包表記
def dedup(seq):
seen = set()
return [x for x in seq if not (x in seen or seen.add(x))]
✅ 演習②:ジェネレータで偶数だけ出力
def even_gen():
for i in range(1, 11):
if i % 2 == 0:
yield i
print(list(even_gen())) # [2, 4, 6, 8, 10]
✅ 演習③:イテレータを手動で使う
nums = iter([10, 20, 30])
print(next(nums)) # 10
print(next(nums)) # 20
✅ まとめ
項目 | 概要 |
---|---|
List | 順序あり・重複OK |
Set | 順序なし・重複NG |
イテレータ |
next() で1つずつ取り出せる |
ジェネレータ |
yield を使ったイテレータ関数 |
ビット演算子 | 論理ではなく2進数レベルの演算で使用 |