カテゴリ: Python 更新日: 2025/12/06

Pythonのラムダ式でクロージャー(Closure)を作る方法!初心者でもわかる使い方

Pythonのラムダ式でクロージャー(Closure)を作る方法
Pythonのラムダ式でクロージャー(Closure)を作る方法

先生と生徒の会話形式で理解しよう

生徒

「先生、ラムダ式を使ってクロージャーっていうのが作れるって聞いたんですけど、クロージャーって何ですか?」

先生

「クロージャーは、簡単に言うと『関数と、その関数が使う変数をセットにして覚えておくもの』です。Pythonではラムダ式でもクロージャーを作れますよ。」

生徒

「関数が変数を覚えておくって、どういう意味ですか?」

先生

「例えば、お店で買い物をするときに『この人は常連さんで、前に買った商品を覚えている』ようなイメージです。クロージャーは関数がその変数の情報を覚えているので、後からその情報を使えます。」

生徒

「そうなんですね!具体的にはどうやって作るんですか?」

先生

「それでは、Pythonのラムダ式を使ったクロージャーの作り方を見ていきましょう!」

1. クロージャー(Closure)とは?

1. クロージャー(Closure)とは?
1. クロージャー(Closure)とは?

プログラミングでクロージャーとは、「ある関数の中で作られた別の関数が、その元の関数の変数を覚えている状態」のことを言います。少し難しいですが、具体的に例を見ると分かりやすいです。

クロージャーは、関数を作る関数とも言えます。Pythonでは、普通の関数だけでなく、ラムダ式(匿名関数)でもクロージャーが作れます。

2. ラムダ式でクロージャーを作る基本の書き方

2. ラムダ式でクロージャーを作る基本の書き方
2. ラムダ式でクロージャーを作る基本の書き方

まずはラムダ式でクロージャーを作る基本的なコード例です。ここでは、外側の関数で数値を受け取り、内側のラムダ式がその数値を使って計算します。


def make_multiplier(n):
    return lambda x: x * n

times3 = make_multiplier(3)
times5 = make_multiplier(5)

print(times3(10))  # 30
print(times5(10))  # 50

ここで、make_multiplierという関数は、nという数字を受け取ります。そして、戻り値として「lambda x: x * n」を返します。これは、引数xに対してx * nの計算をする関数です。

この時、ラムダ式は外側の関数の変数nを覚えています。だから、times3は3倍、times5は5倍の関数になります。これがクロージャーです。

3. クロージャーの仕組みを簡単な例えで理解しよう

3. クロージャーの仕組みを簡単な例えで理解しよう
3. クロージャーの仕組みを簡単な例えで理解しよう

クロージャーをイメージしやすくするために、手紙のやり取りに例えてみます。あなたが「3倍してね」という手紙を作り、それを渡します。この手紙は「3倍してほしい」という情報(n=3)を持っています。あとでこの手紙を使うときに、その3倍の情報を覚えているので、きちんと3倍の計算ができるのです。

同じように、「5倍してね」という手紙も別に持っていて、これもそれぞれ違う計算ができます。クロージャーはこの「手紙」と同じように、関数に必要な情報を覚えておく役割をします。

4. なぜクロージャーは便利なの?

4. なぜクロージャーは便利なの?
4. なぜクロージャーは便利なの?

クロージャーはプログラムの中で「設定を覚えておく」ために便利です。例えば、複雑な設定をいちいち引数で渡さなくても、関数が覚えてくれているので使いやすくなります。

また、関数を動的に作れるので、プログラムを短く、わかりやすく書けることが多いです。

5. ラムダ式でクロージャーを作るときの注意点

5. ラムダ式でクロージャーを作るときの注意点
5. ラムダ式でクロージャーを作るときの注意点
  • クロージャーが覚える変数は「変更されない(イミュータブル)」方がバグが起きにくいです。
  • 複雑すぎると理解しづらくなるので、使いすぎに注意しましょう。
  • クロージャーの中の変数は関数が作られた時点の値を覚えます。

6. クロージャーとラムダ式を使ったもう少し実践的な例

6. クロージャーとラムダ式を使ったもう少し実践的な例
6. クロージャーとラムダ式を使ったもう少し実践的な例

例えば、税率を変えたい関数を作るとき、クロージャーは便利です。


def make_tax_calculator(tax_rate):
    return lambda price: price + price * tax_rate

tax_8 = make_tax_calculator(0.08)
tax_10 = make_tax_calculator(0.10)

print(tax_8(1000))   # 1080.0
print(tax_10(1000))  # 1100.0

ここでは、make_tax_calculator関数が税率を覚えたクロージャーを返します。後で税率ごとの計算が簡単にできますね。

7. クロージャーを使ったラムダ式のポイント整理

7. クロージャーを使ったラムダ式のポイント整理
7. クロージャーを使ったラムダ式のポイント整理
  • クロージャーは関数とその関数が使う変数をセットで覚えておく仕組み
  • Pythonのラムダ式でもクロージャーは作れる
  • 外側の関数で変数を定義し、内側のラムダ式でその変数を使う
  • 設定や状態を覚えておくのに便利で、コードがすっきり書ける
  • 複雑なときは普通の関数defと組み合わせて使うのがおすすめ

まとめ

まとめ
まとめ

Pythonのラムダ式を使ったクロージャーの仕組みを振り返ると、外側の関数で作られた値や状態を、そのまま内側の関数が保持し続けて利用できるという特徴が非常に強力であり、幅広い場面で役立つということがあらためて分かります。クロージャーは「関数が変数を覚えておく」という少し不思議な性質を持っていますが、その性質を理解すると、設定値や計算条件を保ったまま処理を実行したい場面で大きな助けになります。特に、ラムダ式を使うことで短いコードでも同じ仕組みを実現でき、関数を柔軟に扱えるようになる点は、Python学習者にとって非常に学びがいのある部分です。 また、クロージャーの構造は、ただ仕組みを覚えるだけでなく、どのようなタイミングで値が保持され、その後どのように利用されるかを意識すると、より深い理解に繋がります。例えば、倍数計算のような単純なケースから、税率計算や設定値保持などの実用的なケースまで応用がきくため、毎日のプログラミングの中で自然と利用する機会が増えていきます。ラムダ式によるクロージャーは簡潔でありながら非常に表現力が高く、初心者でも扱いやすいので、これを使いこなせるようになることは学習の大きな強みになるでしょう。 さらに、クロージャーは「作られた時点の値を保持する」という性質を持つため、コードの意図を明確にすることにも繋がります。関数が常に同じ状態を持ち続けることは予測しやすさを生み、複雑な処理を組み立てるときにも役立ちます。このように、クロージャーの理解は関数を中心としたPythonの書き方に大きく影響するため、基本としてしっかり身につけておくべき重要な概念といえるでしょう。

サンプルコードで再確認しよう

学んだ内容をさらに深めるために、もう一つクロージャーの例を確認してみましょう。ここでは「割引率」を保持するクロージャーを作っています。ラムダ式で作った関数が外側の変数を覚えているため、後から呼び出すたびにその割引率が適用されます。


def make_discount(rate):
    return lambda price: price - price * rate

discount_5 = make_discount(0.05)
discount_15 = make_discount(0.15)

print(discount_5(2000))   # 1900.0
print(discount_15(2000))  # 1700.0

このコードでは割引率を覚えているラムダ式が、それぞれ異なる計算を行います。クロージャーの核となる「値を保持し続ける」という仕組みがしっかり活用されており、実用性の高い例として理解しやすい構造になっています。複数の設定や条件を扱う場面で応用しやすく、関数を使ったデータ処理に慣れていくうえでも心得ておきたいポイントです。 また、クロージャーは使いすぎると複雑さを生むことがありますが、状況に合わせてdefとラムダ式を使い分けることで、読みやすく整ったコードを書くことができます。変数の状態を追いやすくなり、エラーの防止にもつながるため、細かな動作を理解しながら実践するとさらなる上達につながります。

先生と生徒の振り返り会話

生徒

「クロージャーって、最初は難しそうだと思ったけど、関数が変数を覚えてるだけって考えると分かりやすかったです。ラムダ式で簡単に作れるのも驚きでした!」

先生

「その感覚はとても大切ですね。クロージャーは一度仕組みが分かると応用が広く、さまざまな処理に使える強力な道具になりますよ。」

生徒

「税率を覚える関数とか、実生活に近い例だと想像しやすかったです。他にも色んな状況で使えそうだと思いました!」

先生

「そうですね。設定値を保持したい場面では特に役立ちますし、コードを短くまとめたいときにも力を発揮します。場面に合わせて使い分けられるようになると、さらにプログラミングの幅が広がりますよ。」

生徒

「これからもラムダ式とクロージャーを意識してコードを書いてみます!」

先生

「その意欲があれば大丈夫です。実際に手を動かして試していくことで理解が深まるので、ぜひたくさん活用してみてくださいね。」

カテゴリの一覧へ
新着記事
New1
Flask
Flaskで非同期フォーム送信(Ajax POST)を実装する方法を解説!初心者でもわかるステップ解説
New2
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
New3
Python
PythonでMySQLに接続する方法!pymysqlの基本的な使い方
New4
Flask
FlaskのURLルールとは?ルーティングの基本と動的URLの作り方を解説
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.2
Java&Spring記事人気No2
Flask
Flaskでデータベースを使う基本!SQLAlchemyの導入方法をやさしく解説
No.3
Java&Spring記事人気No3
Python
Pythonでリストの要素を検索・取得する方法!index()やin演算子の活用法
No.4
Java&Spring記事人気No4
Python
Pythonプログラムの書き方を基礎から学ぼう!初心者が覚えるべき文法とは?
No.5
Java&Spring記事人気No5
Flask
Flaskアプリの環境変数をクラウドで安全に設定する方法!初心者のための完全ガイド
No.6
Java&Spring記事人気No6
Python
Pythonで仮想環境(venv)を作る方法!初心者向けに環境構築をステップ解説
No.7
Java&Spring記事人気No7
Python
Pythonのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.8
Java&Spring記事人気No8
Flask
Flaskでクラウド上のメッセージキュー(SQS/PubSub)を扱う完全ガイド!初心者向け解説