基礎から学ぶPython入門 90日コース | 実践Python - Day 21:Pythonらしい書き方

90日で身につけるPython
スポンサーリンク
スポンサーリンク

Day 21:Pythonらしい書き方を身につける

Day 21では、「Pythonらしい書き方」を支える便利な関数や仕組みをまとめて学びます。 enumerate()zip()any()all()sorted()lambdamap()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}")
Python

zip():複数のリストを「並行して」ループする

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} 歳です。")
Python

zip() を使うと、

  • インデックスを意識せずに「ペア」として扱える
  • コードの意図が「名前と年齢を組み合わせている」と読み取りやすくなる

というメリットがあります。

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} 在住です。")
Python

any()・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("パスワードは条件を満たしていません。")
Python

all():全部TrueならTrue

all() は、「イテラブルのすべてが True なら True」を返します。

conditions = [True, True, True]

if all(conditions):
    print("すべての条件を満たしています。")
else:
    print("少なくとも1つは条件を満たしていません。")
Python

any()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]
Python

key引数で「並び替えの基準」を決める

例えば、「名前のリストを長さ順に並び替えたい」場合です。

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
Python

lambda は、

  • 短く書ける
  • 一時的に使う小さな処理を表現する

ときに便利です。ただし、複雑な処理には向きません。

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)
Python

map() を使うと、

  • 「変換処理」を関数として表現し、それを全要素に適用する
  • 「何をしたいか」がコンパクトに見える

ようになります。

組み込み関数と組み合わせる

texts = ["1", "2", "3", "10"]

# 文字列を整数に変換します
numbers = list(map(int, texts))
print(numbers)  # [1, 2, 3, 10]
Python

filter():条件に合うものだけを残す

基本の使い方

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)
Python

filter() を使うと、

  • 「条件」を関数として表現し、それを全要素に適用してフィルタリングする
  • 「どんな条件で絞り込んでいるか」がコンパクトに見える

ようになります。

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つもありません。")
Python

Day 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()
Python

Day 21のまとめ

Day 21では、「Pythonらしい書き方」を支える、

  • enumerate() によるインデックス付きループ
  • zip() による複数リストの並行ループ
  • any()all() による条件のまとめ判定
  • sorted()keyreverse による柔軟な並び替え
  • lambda による小さな関数のその場定義
  • map() による一括変換
  • filter() による一括絞り込み

をステップバイステップで体験していただきました。

ここまで来ると、「Pythonには、for文とif文だけではなく、意図をコンパクトに表現するための道具がたくさんある」という感覚が少し育っているはずです。 この感覚は、今後の実践Python編で、読みやすく・保守しやすいコードを書いていくうえで、とても大きな支えになっていきます。

タイトルとURLをコピーしました