Day 21:Pythonらしい書き方を身につける
Day 21では、「Pythonらしい書き方」を支える便利な関数や仕組みをまとめて学びます。 enumerate()・zip()・any()・all()・sorted()・lambda・map()・filter()を通して、 「for文とif文だけで頑張るコード」から一歩進んだ、読みやすくて意図が伝わる書き方を体験していきます。
enumerate():インデックス付きでループする
ふつうのfor文との違いを知る
リストをループしながら「何番目か」を知りたい場面はよくあります。 まずは、インデックスを手動で管理する書き方を見てみます。
items = ["apple", "banana", "orange"]
index = 0
for item in items:
print(index, item)
index += 1
Pythonこれでも動きますが、インデックスを自分で増やしていくのは少し面倒です。 そこで使えるのが enumerate() です。
items = ["apple", "banana", "orange"]
for index, item in enumerate(items):
# enumerate() が (インデックス, 要素) のペアを返してくれます
print(index, item)
Python- インデックスを自分で管理しなくてよい
- 「何番目の要素か」を自然に扱える
という点が、Pythonらしい書き方の第一歩になります。
開始番号を変える
enumerate() は、開始番号を指定することもできます。
items = ["task1", "task2", "task3"]
for no, task in enumerate(items, start=1):
# start=1 とすることで、1番から番号を振れます
print(f"{no}. {task}")
Pythonzip():複数のリストを「並行して」ループする
2つのリストを同時に回す
例えば、「名前のリスト」と「年齢のリスト」があるとします。
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
Pythonこれを「名前と年齢のペア」として扱いたいとき、zip() が活躍します。
for name, age in zip(names, ages):
# zip() が (name, age) のペアを順番に返してくれます
print(f"{name} は {age} 歳です。")
Python通常のfor文でインデックスを使って書くとこうなります。
for i in range(len(names)):
name = names[i]
age = ages[i]
print(f"{name} は {age} 歳です。")
Pythonzip() を使うと、
- インデックスを意識せずに「ペア」として扱える
- コードの意図が「名前と年齢を組み合わせている」と読み取りやすくなる
というメリットがあります。
3つ以上のリストもまとめて扱える
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
cities = ["Tokyo", "Osaka", "Nagoya"]
for name, age, city in zip(names, ages, cities):
print(f"{name} ({age}歳) は {city} 在住です。")
Pythonany()・all():条件の「まとめ判定」をする
any():1つでもTrueならTrue
any() は、「イテラブルの中に1つでも True があれば True」を返します。
flags = [False, False, True, False]
if any(flags):
print("少なくとも1つはTrueです。")
else:
print("すべてFalseです。")
Python例えば、「パスワードチェックの結果」をまとめて判定するイメージです。
checks = [
len(password) >= 8, # 長さチェック
any(c.isdigit() for c in password), # 数字が含まれているか
any(c.isupper() for c in password), # 大文字が含まれているか
]
if all(checks):
print("パスワードはすべての条件を満たしています。")
else:
print("パスワードは条件を満たしていません。")
Pythonall():全部TrueならTrue
all() は、「イテラブルのすべてが True なら True」を返します。
conditions = [True, True, True]
if all(conditions):
print("すべての条件を満たしています。")
else:
print("少なくとも1つは条件を満たしていません。")
Pythonany() と all() を使うと、
- 複数の条件判定を「まとめて」扱える
- 「全部OKか」「どれか1つでもOKか」を自然に書ける
ようになります。
sorted():並び替えを柔軟に行う
基本の並び替え
sorted() は、「並び替えた新しいリスト」を返す関数です。
numbers = [5, 2, 9, 1, 7]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # [1, 2, 5, 7, 9]
Python元のリストはそのまま残ります。
print(numbers) # [5, 2, 9, 1, 7]
Python逆順に並び替える
numbers = [5, 2, 9, 1, 7]
sorted_desc = sorted(numbers, reverse=True)
print(sorted_desc) # [9, 7, 5, 2, 1]
Pythonkey引数で「並び替えの基準」を決める
例えば、「名前のリストを長さ順に並び替えたい」場合です。
names = ["Alice", "Bob", "Charlie", "Dan"]
# len(name) を基準に並び替えます
sorted_by_length = sorted(names, key=len)
print(sorted_by_length) # ['Bob', 'Dan', 'Alice', 'Charlie']
Pythonここでのポイントは、
key=lenと書くことで、「len(要素) を並び替えの基準にする」ことsorted()は「元のリストを変更せず、新しいリストを返す」こと
です。
lambda:その場で小さな関数を作る
名前を付けない小さな関数
lambda は、「その場で小さな関数を作る」ための仕組みです。 例えば、「数字を2倍にする関数」を lambda で書くとこうなります。
double = lambda x: x * 2
print(double(5)) # 10
Python通常の関数定義と比べてみます。
def double_func(x):
return x * 2
Pythonlambda は、
- 短く書ける
- 一時的に使う小さな処理を表現する
ときに便利です。ただし、複雑な処理には向きません。
sorted() と組み合わせる
例えば、「(名前, 年齢) のタプルのリスト」を年齢順に並び替える例です。
people = [
("Alice", 25),
("Bob", 30),
("Charlie", 20),
]
# 2番目の要素(年齢)を基準に並び替えます
sorted_by_age = sorted(people, key=lambda person: person[1])
print(sorted_by_age)
# [('Charlie', 20), ('Alice', 25), ('Bob', 30)]
Pythonここでは、
lambda person: person[1]が「並び替えの基準」を表していることsorted()のkeyに「小さな関数」を渡していること
がポイントです。
map():すべての要素に「同じ処理」を適用する
基本の使い方
map() は、「イテラブルのすべての要素に同じ関数を適用する」ための関数です。
numbers = [1, 2, 3, 4, 5]
# すべての要素を2倍にします
doubles = list(map(lambda x: x * 2, numbers))
print(doubles) # [2, 4, 6, 8, 10]
Python通常のfor文で書くとこうなります。
doubles = []
for x in numbers:
doubles.append(x * 2)
Pythonmap() を使うと、
- 「変換処理」を関数として表現し、それを全要素に適用する
- 「何をしたいか」がコンパクトに見える
ようになります。
組み込み関数と組み合わせる
texts = ["1", "2", "3", "10"]
# 文字列を整数に変換します
numbers = list(map(int, texts))
print(numbers) # [1, 2, 3, 10]
Pythonfilter():条件に合うものだけを残す
基本の使い方
filter() は、「条件を満たす要素だけを残す」ための関数です。
numbers = [1, 2, 3, 4, 5, 6]
# 偶数だけを残します
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # [2, 4, 6]
Python通常のfor文で書くとこうなります。
evens = []
for x in numbers:
if x % 2 == 0:
evens.append(x)
Pythonfilter() を使うと、
- 「条件」を関数として表現し、それを全要素に適用してフィルタリングする
- 「どんな条件で絞り込んでいるか」がコンパクトに見える
ようになります。
any()・all() と組み合わせるイメージ
例えば、「条件を満たす要素が1つでもあるか」を知りたい場合は、filter() と any() を組み合わせることもできます。
numbers = [1, 3, 5, 7, 8]
# 偶数だけを抽出
evens = list(filter(lambda x: x % 2 == 0, numbers))
if any(evens):
print("偶数が少なくとも1つあります。")
else:
print("偶数は1つもありません。")
PythonDay 21ミニテンプレート:Pythonらしい書き方練習スクリプト
最後に、Day 21で学んだ内容をまとめて試せる「Pythonらしい書き方練習スクリプト」のテンプレートを示します。
# day21_pythonic_style.py
# Pythonらしい書き方の練習用スクリプト
def demo_enumerate():
items = ["apple", "banana", "orange"]
print("=== enumerate() の例 ===")
for index, item in enumerate(items, start=1):
print(f"{index}: {item}")
def demo_zip():
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
print("\n=== zip() の例 ===")
for name, age in zip(names, ages):
print(f"{name} は {age} 歳です。")
def demo_any_all():
print("\n=== any() / all() の例 ===")
flags = [False, True, False]
print("flags:", flags)
print("any(flags):", any(flags))
print("all(flags):", all(flags))
def demo_sorted_lambda():
people = [
("Alice", 25),
("Bob", 30),
("Charlie", 20),
]
print("\n=== sorted() + lambda の例 ===")
print("元のリスト:", people)
sorted_by_age = sorted(people, key=lambda person: person[1])
print("年齢順に並び替え:", sorted_by_age)
def demo_map_filter():
numbers = [1, 2, 3, 4, 5, 6]
print("\n=== map() / filter() の例 ===")
doubles = list(map(lambda x: x * 2, numbers))
print("2倍にしたリスト:", doubles)
evens = list(filter(lambda x: x % 2 == 0, numbers))
print("偶数だけのリスト:", evens)
def main():
demo_enumerate()
demo_zip()
demo_any_all()
demo_sorted_lambda()
demo_map_filter()
if __name__ == "__main__":
main()
PythonDay 21のまとめ
Day 21では、「Pythonらしい書き方」を支える、
enumerate()によるインデックス付きループzip()による複数リストの並行ループany()・all()による条件のまとめ判定sorted()とkey・reverseによる柔軟な並び替えlambdaによる小さな関数のその場定義map()による一括変換filter()による一括絞り込み
をステップバイステップで体験していただきました。
ここまで来ると、「Pythonには、for文とif文だけではなく、意図をコンパクトに表現するための道具がたくさんある」という感覚が少し育っているはずです。 この感覚は、今後の実践Python編で、読みやすく・保守しやすいコードを書いていくうえで、とても大きな支えになっていきます。
