Python|関数の中で関数を定義する「ネスト関数」の使い方

1. はじめに

Pythonでは関数の中に関数を定義することができます。これを「ネスト関数(入れ子関数)」と呼びます。
ネスト関数を使うことで、コードの可読性を高めたり、関数のカプセル化を実現できたりと、より柔軟な設計が可能になります。

本記事では、Python|関数の中で関数を定義する『ネスト関数』の使い方をテーマに、基本構文から実用例、注意点までを初心者にもわかりやすく解説します。

 

2. Pythonにおけるネスト関数の基本

ネスト関数とは?

ネスト関数(nested function)とは、ある関数の内部で定義される関数のことです。
外側の関数から呼び出される専用の補助関数として利用され、ローカル関数とも呼ばれます。

基本構文と簡単な例

以下はネスト関数の基本的な書き方です。

def outer_function():
    print("外側の関数です")

    def inner_function():
        print("内側の関数です")

    inner_function()

実行結果:

外側の関数です
内側の関数です

このように、outer_functionを呼び出すと、内部のinner_functionも実行されます。
ただし、inner_function()は外から直接呼び出すことはできません。これは、スコープ(変数の有効範囲)によるものです。

ローカルスコープとネスト関数

ネスト関数は、外側の関数の変数にアクセスできます(クロージャの基礎概念にも関係)。以下のコードを見てみましょう。

def greeting(name):
    def message():
        return f"こんにちは、{name}さん!"
    return message()

実行結果:

>>> greeting("さとし")
こんにちは、さとしさん!

内部関数messageは、外側の関数greetingの引数nameにアクセスできています。
これがネスト関数の大きな特徴です。

 

3. よくある使い方・応用例

関数内のロジック整理に使う

処理が長くなる関数内で、補助的な処理をまとめる目的でネスト関数を使うと、可読性が向上します。

def process_data(data):
    def clean(d):
        return d.strip().lower()

    cleaned = [clean(item) for item in data]
    return cleaned

実行結果:

>>> process_data([" Apple ", " Banana ", "Cherry "])
['apple', 'banana', 'cherry']

このように、関数内だけで使う補助的な関数を閉じ込めることで、コードの意図が明確になります。

クロージャとして関数を返す

ネスト関数はクロージャとして活用できます。以下は典型的な例です。

def multiplier(factor):
    def multiply(x):
        return x * factor
    return multiply

実行結果:


>>> double = multiplier(2)
>>> double(5)
10

>>> triple = multiplier(3)
>>> triple(5)
15

このように、factorという変数を保持した関数multiplyを返すことで、動的に関数を生成できます。
この仕組みは、Pythonでデコレータを使うときの基本にもなります。

Pythonデコレータとネスト関数

デコレータとは、関数に追加機能を与える構文ですが、内部的にはネスト関数とクロージャの仕組みが使われています。

def my_decorator(func):
    def wrapper():
        print("実行前")
        func()
        print("実行後")
    return wrapper

@my_decorator
def say_hello():
    print("こんにちは!")

say_hello()

実行結果:

実行前
こんにちは!
実行後

このように、wrapperというネスト関数が外部のfuncをラップし、新しい機能を追加しています。

 

4. 注意点・エラー対策

ネスト関数は外部から直接呼べない

ネスト関数は定義された外側の関数スコープ内でしか使えません。以下のようなコードはエラーになります。

def outer():
    def inner():
        print("内側")
    # inner関数はこのスコープ内でしか使えない

# inner()  # ← これはエラー

実行結果:

NameError: name 'inner' is not defined

多重ネストは可読性が下がる

あまりにもネストが深いと、読みづらくなってしまいます。
ネスト関数はあくまで「補助的な用途」「閉じたロジック」に絞って使いましょう。

 

5. まとめ

今回は「Python|関数の中で関数を定義する『ネスト関数』の使い方」について、基本から応用までを解説しました。

  • ネスト関数は関数内で定義されるローカル関数
  • 外側の変数にアクセスできる(クロージャ)
  • 補助関数やデコレータなどに使われる

特にデコレータやクロージャに触れる際には避けて通れない概念です。
学習を進めるうえでのコツとしては、「必要な範囲で機能を閉じ込めたい時に使う」ことを意識すると、実務でも自然に使えるようになります。

これを機に、ぜひ自分のコードでもネスト関数を活用してみましょう!

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