ステップ18:lambda関数と組み込み関数

λ ステップ18: lambda関数と組み込み関数

短い関数を簡潔に書き、便利な組み込み関数を使いこなそう!

今まで、関数はdefで定義していました。でも、「2倍にする」のような簡単な処理のために、わざわざ名前を付けて関数を作るのは面倒ですよね。このステップでは、もっと簡潔に関数を書く方法を学びます。

📖 このステップで学ぶこと

・lambda(無名関数)の使い方

・map関数(全要素に処理を適用)

・filter関数(条件に合う要素を抽出)

・sorted関数(並び替え)

・よく使う組み込み関数

🎯 1. lambda関数って何?

🔰 普通の関数との比較

まず、普通の関数で「数を2倍にする」処理を書いてみましょう。

コード:普通の関数(def)

※スマートフォンでは横スクロールできます

# 普通の関数 - 3行必要
def double(x):
    return x * 2

print(double(5))
print(double(10))

実行結果

10
20

たった「2倍にする」だけの処理に3行も使うのは少し長いですね。

lambda関数を使うと、同じことが1行で書けます!

コード:lambda関数

※スマートフォンでは横スクロールできます

# lambda関数 - 1行で書ける!
double = lambda x: x * 2

print(double(5))
print(double(10))

実行結果

10
20

📌 lambda関数のイメージ

lambda関数は「無名関数」とも呼ばれます。

名前を付けずに、その場で使い捨ての関数を作れます。

特に、map、filter、sortedなどと組み合わせて使う時に便利です!

📘 lambda関数の書き方

📝 lambda関数の構文

lambda 引数: 式

lambda:lambda関数を作るキーワード

引数:受け取る値(複数可)

:計算や処理(1つだけ)

※ returnは書かない(自動的に式の結果が返される)

📌 普通の関数とlambda関数の対応

普通の関数(def) lambda関数
def double(x):
return x * 2
lambda x: x * 2
def add(a, b):
return a + b
lambda a, b: a + b

📝 例1:1つの引数

完成コード:2乗する関数

※スマートフォンでは横スクロールできます

# lambda x: x ** 2
# x を受け取って、x の2乗を返す
square = lambda x: x ** 2

print(square(5))   # 5の2乗 = 25
print(square(3))   # 3の2乗 = 9

実行結果

25
9

📝 例2:複数の引数

完成コード:2つの数を足す

※スマートフォンでは横スクロールできます

# lambda a, b: a + b
# a と b を受け取って、足し算の結果を返す
add = lambda a, b: a + b

print(add(10, 20))  # 30
print(add(5, 8))    # 13

実行結果

30
13

📝 例3:条件式(三項演算子)

lambda関数の中で条件式も使えます。

完成コード:偶数か奇数か判定

※スマートフォンでは横スクロールできます

# lambda x: "偶数" if x % 2 == 0 else "奇数"
# x を受け取って、偶数なら"偶数"、そうでなければ"奇数"を返す
is_even = lambda x: "偶数" if x % 2 == 0 else "奇数"

print(is_even(4))   # 偶数
print(is_even(7))   # 奇数
print(is_even(10))  # 偶数

実行結果

偶数
奇数
偶数

💡 条件式(三項演算子)の書き方

値1 if 条件 else 値2

条件がTrueなら値1、Falseなら値2を返します。

📝 lambda関数の特徴と制限

💡 lambda関数の特徴

・名前を付けなくてもいい(無名関数)

・1行で書ける

・returnは不要(自動的に返される)

・map、filter、sortedと相性が良い

⚠️ lambda関数の制限

・式は1つだけ(複数行は書けない)

・if文、for文は書けない(条件式は使える)

・複雑な処理には向かない

複雑な処理は普通の関数(def)を使いましょう!

📌 lambda関数を使う場面・使わない場面

場面 使う? 理由
シンプルな計算(2倍、2乗など) ✅ 使う 1行で書ける
map/filter/sortedと組み合わせ ✅ 使う 使い捨ての関数に最適
複数行の処理 ❌ 使わない defを使う
何度も使う関数 ❌ 使わない defで名前を付ける

🔄 2. map関数 – 全ての要素に処理を適用

map関数を使うと、リストの全ての要素に同じ処理を適用できます。lambda関数と組み合わせると非常に便利です!

🔰 map関数とは?

例えば、リストの全ての数を2倍にしたい場合を考えてみましょう。

コード:for文を使う場合(従来の方法)

※スマートフォンでは横スクロールできます

numbers = [1, 2, 3, 4, 5]

# for文で2倍にする
doubled = []
for num in numbers:
    doubled.append(num * 2)

print(doubled)

実行結果

[2, 4, 6, 8, 10]

map関数を使うと、同じことが1行で書けます!

コード:map関数を使う場合

※スマートフォンでは横スクロールできます

numbers = [1, 2, 3, 4, 5]

# map(関数, リスト) で全要素に関数を適用
# lambda x: x * 2 → 各要素を2倍にする関数
doubled = list(map(lambda x: x * 2, numbers))

print(doubled)

実行結果

[2, 4, 6, 8, 10]

📘 map関数の書き方

📝 map関数の構文

map(関数, リスト)

関数:各要素に適用する関数(lambdaや普通の関数)

リスト:処理対象のリスト

※ 結果はmapオブジェクトなので、list()で変換します

💡 処理の流れ

1. リストの各要素を1つずつ取り出す

2. 取り出した要素に関数を適用する

3. 結果を新しいリストにまとめる

📝 例1:文字列を大文字に変換

完成コード:全て大文字に

※スマートフォンでは横スクロールできます

words = ["hello", "world", "python"]

# lambda s: s.upper() → 各文字列を大文字に変換
upper_words = list(map(lambda s: s.upper(), words))

print(upper_words)

実行結果

['HELLO', 'WORLD', 'PYTHON']

📝 例2:数値を文字列に変換

完成コード:数値→文字列

※スマートフォンでは横スクロールできます

numbers = [1, 2, 3, 4, 5]

# str(x) で数値を文字列に変換
# lambdaを使わず、組み込み関数strを直接渡せる
str_numbers = list(map(str, numbers))

print(str_numbers)
print(type(str_numbers[0]))  # 型を確認

実行結果

['1', '2', '3', '4', '5']
<class 'str'>

💡 ポイント

lambdaを使わなくても、組み込み関数(str、int、len など)を直接渡せます。

map(str, numbers) = map(lambda x: str(x), numbers)

📝 例3:税込み価格を計算

完成コード:10%の消費税を加算

※スマートフォンでは横スクロールできます

prices = [100, 250, 180, 320, 90]

# lambda p: int(p * 1.1) → 1.1倍して整数に
with_tax = list(map(lambda p: int(p * 1.1), prices))

print(f"税抜: {prices}")
print(f"税込: {with_tax}")

実行結果

税抜: [100, 250, 180, 320, 90]
税込: [110, 275, 198, 352, 99]

📝 例4:複数のリストを同時に処理

map関数は複数のリストを同時に処理できます。

完成コード:2つのリストを足し算

※スマートフォンでは横スクロールできます

list1 = [1, 2, 3]
list2 = [10, 20, 30]

# lambda x, y: x + y → 2つの引数を足す
# map(関数, リスト1, リスト2) で同時に処理
result = list(map(lambda x, y: x + y, list1, list2))

print(result)  # [1+10, 2+20, 3+30]

実行結果

[11, 22, 33]

📝 mapと内包表記の比較

mapと同じことは内包表記でもできます。どちらを使ってもOKです!

📌 mapと内包表記の比較

処理 map + lambda 内包表記
2倍にする list(map(lambda x: x*2, lst)) [x*2 for x in lst]
大文字に list(map(lambda s: s.upper(), lst)) [s.upper() for s in lst]
2乗 list(map(lambda x: x**2, lst)) [x**2 for x in lst]

一般的には内包表記の方が読みやすいと言われていますが、好みで選んでOKです。

🔍 3. filter関数 – 条件に合う要素だけ抽出

filter関数を使うと、条件に合う要素だけを取り出せます。

🔰 filter関数とは?

例えば、リストから偶数だけを取り出したい場合を考えてみましょう。

コード:for文を使う場合(従来の方法)

※スマートフォンでは横スクロールできます

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# for文で偶数だけ取り出す
even_numbers = []
for num in numbers:
    if num % 2 == 0:
        even_numbers.append(num)

print(even_numbers)

実行結果

[2, 4, 6, 8, 10]

filter関数を使うと、同じことが1行で書けます!

コード:filter関数を使う場合

※スマートフォンでは横スクロールできます

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# filter(関数, リスト) で条件に合う要素だけ抽出
# lambda x: x % 2 == 0 → 偶数ならTrue
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))

print(even_numbers)

実行結果

[2, 4, 6, 8, 10]

📘 filter関数の書き方

📝 filter関数の構文

filter(関数, リスト)

関数:True/Falseを返す関数(条件判定)

リスト:処理対象のリスト

※ 関数がTrueを返した要素だけが残ります

※ 結果はfilterオブジェクトなので、list()で変換します

💡 処理の流れ

1. リストの各要素を1つずつ取り出す

2. 取り出した要素を関数に渡して判定する

3. Trueが返ってきた要素だけを残す

📝 例1:正の数だけ取り出す

完成コード:正の数をフィルタ

※スマートフォンでは横スクロールできます

numbers = [5, -3, 8, -1, 10, -7, 0]

# lambda x: x > 0 → 正の数ならTrue
positive = list(filter(lambda x: x > 0, numbers))

print(f"元のリスト: {numbers}")
print(f"正の数だけ: {positive}")

実行結果

元のリスト: [5, -3, 8, -1, 10, -7, 0]
正の数だけ: [5, 8, 10]

📝 例2:長い単語だけ取り出す

完成コード:4文字以上の単語をフィルタ

※スマートフォンでは横スクロールできます

words = ["cat", "elephant", "dog", "giraffe", "ant", "bird"]

# lambda w: len(w) >= 4 → 4文字以上ならTrue
long_words = list(filter(lambda w: len(w) >= 4, words))

print(f"4文字以上: {long_words}")

実行結果

4文字以上: ['elephant', 'giraffe', 'bird']

📝 例3:合格者の点数を取り出す

完成コード:60点以上をフィルタ

※スマートフォンでは横スクロールできます

scores = [45, 78, 92, 55, 88, 34, 67, 100]

# lambda s: s >= 60 → 60点以上ならTrue
passed = list(filter(lambda s: s >= 60, scores))

print(f"全員の点数: {scores}")
print(f"合格者の点数: {passed}")
print(f"合格者数: {len(passed)}人")

実行結果

全員の点数: [45, 78, 92, 55, 88, 34, 67, 100]
合格者の点数: [78, 92, 88, 67, 100]
合格者数: 5人

📝 例4:空でない文字列だけ取り出す

完成コード:空文字を除外

※スマートフォンでは横スクロールできます

texts = ["hello", "", "world", "", "python", ""]

# 空文字列は False 扱いなので、そのまま使える
# lambda s: s → 空でなければTrue(Pythonでは空文字列はFalse)
non_empty = list(filter(lambda s: s, texts))

print(f"元のリスト: {texts}")
print(f"空を除外: {non_empty}")

実行結果

元のリスト: ['hello', '', 'world', '', 'python', '']
空を除外: ['hello', 'world', 'python']

💡 Pythonの「真偽値」の扱い

Pythonでは、以下の値はFalse扱いになります:

""(空文字列)

0(ゼロ)

[](空リスト)

None

これを利用すると、filter(lambda x: x, list)で「空でない要素」を取り出せます。

📝 例5:複数条件でフィルタ

完成コード:10以上30以下をフィルタ

※スマートフォンでは横スクロールできます

numbers = [5, 15, 8, 23, 4, 30, 12, 35, 18]

# lambda x: 10 <= x <= 30 → 10以上30以下ならTrue
# Pythonでは連鎖比較が使える
filtered = list(filter(lambda x: 10 <= x <= 30, numbers))

print(f"10以上30以下: {filtered}")

実行結果

10以上30以下: [15, 23, 30, 12, 18]

📌 filterと内包表記の比較

処理 filter + lambda 内包表記
偶数だけ list(filter(lambda x: x%2==0, lst)) [x for x in lst if x%2==0]
正の数だけ list(filter(lambda x: x>0, lst)) [x for x in lst if x>0]

📊 4. sorted関数 – 並び替え

sorted関数を使うと、リストを並び替えられます。lambda関数でソートのキー(基準)を指定できます。

🔰 sorted関数の基本

完成コード:基本的な並び替え

※スマートフォンでは横スクロールできます

numbers = [5, 2, 8, 1, 9, 3]

# sorted(リスト) → 昇順(小さい順)
ascending = sorted(numbers)
print(f"昇順: {ascending}")

# sorted(リスト, reverse=True) → 降順(大きい順)
descending = sorted(numbers, reverse=True)
print(f"降順: {descending}")

# 元のリストは変更されない
print(f"元のリスト: {numbers}")

実行結果

昇順: [1, 2, 3, 5, 8, 9]
降順: [9, 8, 5, 3, 2, 1]
元のリスト: [5, 2, 8, 1, 9, 3]

📘 sorted関数の書き方

📝 sorted関数の構文

sorted(リスト, key=関数, reverse=True/False)

リスト:並び替えるリスト

key:並び替えの基準を決める関数(省略可)

reverse:Trueなら降順、Falseなら昇順(デフォルトはFalse)

※ 元のリストは変更されず、新しいリストが返される

📝 例1:文字列の長さでソート

完成コード:短い順に並べる

※スマートフォンでは横スクロールできます

words = ["python", "is", "awesome", "and", "fun"]

# key=lambda w: len(w) → 文字列の長さでソート
sorted_words = sorted(words, key=lambda w: len(w))

print(f"長さ順: {sorted_words}")

実行結果

長さ順: ['is', 'and', 'fun', 'python', 'awesome']

💡 key引数の役割

key引数には「何を基準にソートするか」を決める関数を渡します。

key=lambda w: len(w) → 各要素の「長さ」を基準にソート

元の要素ではなく、関数が返した値で並び替えが行われます。

📝 例2:絶対値でソート

完成コード:絶対値の小さい順

※スマートフォンでは横スクロールできます

numbers = [-5, 3, -8, 1, -2, 7]

# key=lambda x: abs(x) → 絶対値でソート
sorted_nums = sorted(numbers, key=lambda x: abs(x))

print(f"絶対値順: {sorted_nums}")

実行結果

絶対値順: [1, -2, 3, -5, 7, -8]

📝 例3:タプルのリストをソート

タプルのリストでは、どの要素を基準にするか指定できます。

完成コード:点数でソート(高い順)

※スマートフォンでは横スクロールできます

# (名前, 点数) のタプルのリスト
students = [
    ("太郎", 75),
    ("花子", 92),
    ("次郎", 68),
    ("美咲", 88)
]

# key=lambda s: s[1] → タプルの2番目(点数)でソート
# reverse=True → 降順(高い順)
sorted_students = sorted(students, key=lambda s: s[1], reverse=True)

print("=== 点数順(高い順) ===")
for name, score in sorted_students:
    print(f"{name}: {score}点")

実行結果

=== 点数順(高い順) ===
花子: 92点
美咲: 88点
太郎: 75点
次郎: 68点

📝 例4:辞書のリストをソート

完成コード:年齢でソート

※スマートフォンでは横スクロールできます

people = [
    {"name": "太郎", "age": 25},
    {"name": "花子", "age": 20},
    {"name": "次郎", "age": 30},
    {"name": "美咲", "age": 22}
]

# key=lambda p: p["age"] → 辞書の"age"キーでソート
sorted_people = sorted(people, key=lambda p: p["age"])

print("=== 年齢順(若い順) ===")
for person in sorted_people:
    print(f"{person['name']}: {person['age']}歳")

実行結果

=== 年齢順(若い順) ===
花子: 20歳
美咲: 22歳
太郎: 25歳
次郎: 30歳

📝 例5:複数のキーでソート

複数の基準でソートする場合は、タプルを返します。

完成コード:部署 → 年齢の順でソート

※スマートフォンでは横スクロールできます

employees = [
    {"name": "太郎", "dept": "営業", "age": 25},
    {"name": "花子", "dept": "開発", "age": 28},
    {"name": "次郎", "dept": "営業", "age": 30},
    {"name": "美咲", "dept": "開発", "age": 22}
]

# key=lambda e: (e["dept"], e["age"])
# → まず部署でソート、同じ部署内では年齢でソート
sorted_emp = sorted(employees, key=lambda e: (e["dept"], e["age"]))

print("=== 部署順 → 年齢順 ===")
for emp in sorted_emp:
    print(f"{emp['dept']} - {emp['name']}: {emp['age']}歳")

実行結果

=== 部署順 → 年齢順 ===
営業 - 太郎: 25歳
営業 - 次郎: 30歳
開発 - 美咲: 22歳
開発 - 花子: 28歳

📝 sortedとsortの違い

📌 sortedとsortの違い

比較項目 sorted() list.sort()
使い方 sorted(リスト) リスト.sort()
元のリスト 変更されない 変更される
戻り値 新しいリストを返す Noneを返す
使える対象 リスト以外も可 リストのみ

コード:sortedとsortの違いを確認

※スマートフォンでは横スクロールできます

# sorted() - 元のリストは変わらない
numbers1 = [5, 2, 8, 1]
result1 = sorted(numbers1)
print(f"sorted後: {result1}")
print(f"元のリスト: {numbers1}")  # 変わっていない

print("---")

# sort() - 元のリストが変わる
numbers2 = [5, 2, 8, 1]
numbers2.sort()  # 戻り値はNone
print(f"sort後: {numbers2}")  # 変わっている

実行結果

sorted後: [1, 2, 5, 8]
元のリスト: [5, 2, 8, 1]
---
sort後: [1, 2, 5, 8]

🛠️ 5. よく使う組み込み関数

Pythonには便利な組み込み関数がたくさんあります。よく使うものを紹介します!

📝 all() – 全てTrueか判定

all()は、全ての要素がTrueの場合にTrueを返します。

完成コード:全員合格か判定

※スマートフォンでは横スクロールできます

scores1 = [75, 82, 90, 68]
scores2 = [75, 82, 55, 68]  # 55は不合格

# all(条件 for 要素 in リスト) → 全て条件を満たすか
all_passed1 = all(score >= 60 for score in scores1)
all_passed2 = all(score >= 60 for score in scores2)

print(f"scores1 全員合格? {all_passed1}")
print(f"scores2 全員合格? {all_passed2}")

実行結果

scores1 全員合格? True
scores2 全員合格? False

📝 any() – 1つでもTrueか判定

any()は、1つでもTrueがあればTrueを返します。

完成コード:負の数があるか判定

※スマートフォンでは横スクロールできます

numbers1 = [5, 10, 3, 8]
numbers2 = [5, 10, -3, 8]  # -3がある

# any(条件 for 要素 in リスト) → 1つでも条件を満たすか
has_negative1 = any(num < 0 for num in numbers1)
has_negative2 = any(num < 0 for num in numbers2)

print(f"numbers1 負の数がある? {has_negative1}")
print(f"numbers2 負の数がある? {has_negative2}")

実行結果

numbers1 負の数がある? False
numbers2 負の数がある? True

📝 zip() – 複数リストをまとめる

zip()は、複数のリストを同時にループできます。

完成コード:2つのリストを同時に処理

※スマートフォンでは横スクロールできます

names = ["太郎", "花子", "次郎"]
ages = [15, 14, 16]
hobbies = ["サッカー", "読書", "ゲーム"]

# zip()で3つのリストを同時にループ
for name, age, hobby in zip(names, ages, hobbies):
    print(f"{name}さんは{age}歳、趣味は{hobby}")

実行結果

太郎さんは15歳、趣味はサッカー
花子さんは14歳、趣味は読書
次郎さんは16歳、趣味はゲーム

📝 enumerate() – インデックス付きループ

enumerate()を使うと、インデックス(番号)と要素を同時に取得できます。

完成コード:番号付きで表示

※スマートフォンでは横スクロールできます

fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]

# enumerate(リスト) → (インデックス, 要素) を返す
for i, fruit in enumerate(fruits):
    print(f"{i}: {fruit}")

print("---")

# start=1 でインデックスを1から始める
for i, fruit in enumerate(fruits, start=1):
    print(f"{i}. {fruit}")

実行結果

0: りんご
1: バナナ
2: オレンジ
3: ぶどう
---
1. りんご
2. バナナ
3. オレンジ
4. ぶどう

📝 sum() / max() / min() / len()

数値リストでよく使う関数です。

完成コード:統計情報を計算

※スマートフォンでは横スクロールできます

scores = [75, 82, 90, 68, 95, 78]

print(f"点数: {scores}")
print(f"合計: {sum(scores)}点")
print(f"人数: {len(scores)}人")
print(f"平均: {sum(scores) / len(scores):.1f}点")
print(f"最高: {max(scores)}点")
print(f"最低: {min(scores)}点")

実行結果

点数: [75, 82, 90, 68, 95, 78]
合計: 488点
人数: 6人
平均: 81.3点
最高: 95点
最低: 68点

📝 abs() – 絶対値

完成コード:絶対値を取得

※スマートフォンでは横スクロールできます

print(f"abs(-5) = {abs(-5)}")
print(f"abs(10) = {abs(10)}")
print(f"abs(-3.14) = {abs(-3.14)}")

実行結果

abs(-5) = 5
abs(10) = 10
abs(-3.14) = 3.14

📝 round() – 四捨五入

完成コード:四捨五入

※スマートフォンでは横スクロールできます

# round(数値) → 整数に四捨五入
print(f"round(3.7) = {round(3.7)}")
print(f"round(3.2) = {round(3.2)}")

# round(数値, 桁数) → 指定した桁数に四捨五入
print(f"round(3.14159, 2) = {round(3.14159, 2)}")
print(f"round(3.14159, 3) = {round(3.14159, 3)}")

実行結果

round(3.7) = 4
round(3.2) = 3
round(3.14159, 2) = 3.14
round(3.14159, 3) = 3.142

📝 よく使う組み込み関数のまとめ

📌 組み込み関数一覧

関数 説明
len() 要素数を返す len([1,2,3]) → 3
sum() 合計を返す sum([1,2,3]) → 6
max() 最大値を返す max([1,2,3]) → 3
min() 最小値を返す min([1,2,3]) → 1
abs() 絶対値を返す abs(-5) → 5
round() 四捨五入 round(3.7) → 4
all() 全てTrueか all([True,True]) → True
any() 1つでもTrueか any([False,True]) → True
zip() 複数リストをまとめる zip([1,2],[3,4])
enumerate() インデックス付きで返す enumerate(['a','b'])

🎯 6. 実践的な例

例1: 成績処理システム

filter、sorted、lambdaを組み合わせた実用例です。

完成コード:合格者を点数順に表示

※スマートフォンでは横スクロールできます

students = [
    {"name": "太郎", "score": 75},
    {"name": "花子", "score": 92},
    {"name": "次郎", "score": 68},
    {"name": "美咲", "score": 88},
    {"name": "健太", "score": 55}
]

# 1. filterで合格者だけ抽出(60点以上)
passed = filter(lambda s: s["score"] >= 60, students)

# 2. sortedで点数順にソート(高い順)
sorted_passed = sorted(passed, key=lambda s: s["score"], reverse=True)

# 3. 結果を表示
print("=== 合格者(点数順) ===")
for i, student in enumerate(sorted_passed, start=1):
    print(f"{i}位: {student['name']} - {student['score']}点")

実行結果

=== 合格者(点数順) ===
1位: 花子 - 92点
2位: 美咲 - 88点
3位: 太郎 - 75点
4位: 次郎 - 68点

例2: データ変換パイプライン

map、filter、sortedを連続して使う例です。

完成コード:価格データの処理

※スマートフォンでは横スクロールできます

prices = [100, 250, 180, 320, 90, 400, 150]

# 処理1: 10%増税(map)
with_tax = list(map(lambda p: p * 1.1, prices))
print(f"税込: {with_tax}")

# 処理2: 200円以上だけ抽出(filter)
expensive = list(filter(lambda p: p >= 200, with_tax))
print(f"200円以上: {expensive}")

# 処理3: 四捨五入(map)
rounded = list(map(lambda p: round(p), expensive))
print(f"四捨五入: {rounded}")

# 処理4: 高い順にソート(sorted)
final = sorted(rounded, reverse=True)
print(f"高い順: {final}")

実行結果

税込: [110.0, 275.0, 198.0, 352.0, 99.0, 440.0, 165.0]
200円以上: [275.0, 352.0, 440.0]
四捨五入: [275, 352, 440]
高い順: [440, 352, 275]

📝 練習問題(10問)

ここまで学んだことを実際に手を動かして確認しましょう。

問題1:lambda関数で3倍(初級)

📋 問題

数を3倍にするlambda関数を作りましょう。

解答を見る

コード

※スマートフォンでは横スクロールできます

# lambda x: x * 3 → 受け取った数を3倍にする
triple = lambda x: x * 3

print(triple(5))   # 15
print(triple(10))  # 30

実行結果

15
30

問題2:mapで全て2乗(初級)

📋 問題

リスト[1, 2, 3, 4, 5]の各要素を2乗したリストを、mapとlambdaを使って作りましょう。

解答を見る

コード

※スマートフォンでは横スクロールできます

numbers = [1, 2, 3, 4, 5]

# map(lambda x: x ** 2, numbers) → 各要素を2乗
squared = list(map(lambda x: x ** 2, numbers))

print(squared)

実行結果

[1, 4, 9, 16, 25]

問題3:filterで奇数だけ(初級)

📋 問題

リスト[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]から奇数だけを取り出しましょう。

解答を見る

コード

※スマートフォンでは横スクロールできます

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# lambda x: x % 2 == 1 → 奇数ならTrue
odd_numbers = list(filter(lambda x: x % 2 == 1, numbers))

print(odd_numbers)

実行結果

[1, 3, 5, 7, 9]

問題4:名前の長さでソート(中級)

📋 問題

リスト[“太郎”, “花子”, “次郎太”, “美咲”]を名前の長さでソートしましょう。

解答を見る

コード

※スマートフォンでは横スクロールできます

names = ["太郎", "花子", "次郎太", "美咲"]

# key=lambda n: len(n) → 名前の長さでソート
sorted_names = sorted(names, key=lambda n: len(n))

print(sorted_names)

実行結果

['太郎', '花子', '美咲', '次郎太']

問題5:絶対値でソート(中級)

📋 問題

リスト[-5, 3, -8, 1, -2, 7]を絶対値の大きさでソートしましょう。

解答を見る

コード

※スマートフォンでは横スクロールできます

numbers = [-5, 3, -8, 1, -2, 7]

# key=lambda x: abs(x) → 絶対値でソート
sorted_nums = sorted(numbers, key=lambda x: abs(x))

print(sorted_nums)

実行結果

[1, -2, 3, -5, 7, -8]

問題6:摂氏から華氏に変換(中級)

📋 問題

リスト[0, 10, 20, 30]の摂氏温度を、mapとlambdaを使って華氏に変換しましょう。

(華氏 = 摂氏 × 1.8 + 32)

解答を見る

コード

※スマートフォンでは横スクロールできます

celsius = [0, 10, 20, 30]

# lambda c: c * 1.8 + 32 → 摂氏を華氏に変換
fahrenheit = list(map(lambda c: c * 1.8 + 32, celsius))

print(f"摂氏: {celsius}")
print(f"華氏: {fahrenheit}")

実行結果

摂氏: [0, 10, 20, 30]
華氏: [32.0, 50.0, 68.0, 86.0]

問題7:全員合格判定(中級)

📋 問題

点数のリスト[75, 82, 90, 68]で、全員が60点以上かどうかをall()を使って判定しましょう。

解答を見る

コード

※スマートフォンでは横スクロールできます

scores = [75, 82, 90, 68]

# all(条件 for 要素 in リスト) → 全て条件を満たすか
all_passed = all(score >= 60 for score in scores)

print(f"点数: {scores}")
print(f"全員合格: {all_passed}")

実行結果

点数: [75, 82, 90, 68]
全員合格: True

問題8:複数条件でフィルタ(上級)

📋 問題

数値のリスト[15, 8, 23, 4, 30, 12, 18]から、10以上30以下の数だけを取り出しましょう。

解答を見る

コード

※スマートフォンでは横スクロールできます

numbers = [15, 8, 23, 4, 30, 12, 18]

# lambda x: 10 <= x <= 30 → 10以上30以下ならTrue
filtered = list(filter(lambda x: 10 <= x <= 30, numbers))

print(filtered)

実行結果

[15, 23, 30, 12, 18]

問題9:辞書のソートと抽出(上級)

📋 問題

以下の商品リストから、価格が200円以上のものだけを価格順(降順)で表示しましょう。

products = [{“name”: “りんご”, “price”: 150}, {“name”: “バナナ”, “price”: 200}, {“name”: “メロン”, “price”: 500}]

解答を見る

コード

※スマートフォンでは横スクロールできます

products = [
    {"name": "りんご", "price": 150},
    {"name": "バナナ", "price": 200},
    {"name": "メロン", "price": 500}
]

# 1. 200円以上をフィルタ
expensive = filter(lambda p: p["price"] >= 200, products)

# 2. 価格順(降順)にソート
sorted_products = sorted(expensive, key=lambda p: p["price"], reverse=True)

# 3. 表示
for product in sorted_products:
    print(f"{product['name']}: {product['price']}円")

実行結果

メロン: 500円
バナナ: 200円

問題10:データ変換パイプライン(上級)

📋 問題

リスト[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]に対して、以下の処理を順に適用しましょう。

1. 2乗する

2. 50以上のものだけ残す

3. 降順にソート

解答を見る

コード

※スマートフォンでは横スクロールできます

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 1. 2乗(map)
squared = list(map(lambda x: x ** 2, numbers))
print(f"2乗: {squared}")

# 2. 50以上(filter)
filtered = list(filter(lambda x: x >= 50, squared))
print(f"50以上: {filtered}")

# 3. 降順ソート(sorted)
result = sorted(filtered, reverse=True)
print(f"降順: {result}")

実行結果

2乗: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
50以上: [64, 81, 100]
降順: [100, 81, 64]

❓ よくある質問

Q1: lambda関数と普通の関数、どっちを使うべき?

簡単な処理(1行で書ける)ならlambda、複雑な処理なら普通の関数を使いましょう。

「読みやすさ」を優先してください。

Q2: mapと内包表記はどっちがいい?

どちらでもOKです!好みやチームのコーディング規約に従いましょう。

一般的には内包表記の方が読みやすいと言われています。

Q3: lambda関数に名前を付けるべき?

map、filter、sortedなどで一時的に使う時は名前不要です。

何度も使うなら普通の関数として定義した方が良いでしょう。

Q4: sortedとsortの違いは?

sorted()は新しいリストを返す(元のリストは変わらない)

list.sort()は元のリストを変更する(戻り値はNone)

元のリストを保持したいならsortedを使いましょう。

🎉 ステップ18のまとめ

✅ このステップで学んだこと

lambda関数lambda 引数: 式で短い関数を1行で書ける

map関数map(関数, リスト)で全要素に処理を適用

filter関数filter(関数, リスト)で条件に合う要素を抽出

sorted関数sorted(リスト, key=関数)で並び替え

組み込み関数:all、any、zip、enumerate、sum、max、min、abs、roundなど

💪 次のステップへ

lambda関数と組み込み関数をマスターしました!

これで、短くて読みやすいコードが書けるようになりました。

関数編はここまでです。

次のステップでは、モジュールとインポートを学びます。

既に作られた便利な機能を使えるようになりますよ!

📝

学習メモ

Pythonプログラミング基礎 - Step 18

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE