λ ステップ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