Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのネストされた関数(入れ子関数)の仕組みと使い方をわかりやすく解説

Pythonにおけるネストされた関数とは

Pythonでは、関数の中にさらに別の関数を定義できます。これを「ネストされた関数(入れ子関数)」と呼びます。内側の関数は、それを囲む外側のスコープ(エンクロージングスコープ)にある変数、つまりローカル変数にアクセスできるのが大きな特徴です。

この性質を活かすと、「クロージャ」と呼ばれる強力なプログラミングパターンを実現できます。以下のサンプルコードで具体的に見ていきましょう。

def mulFunc(num1):
    def mul(num2):
        return num1 * num2
    return mul

res = mulFunc(15)
# 20 × 15 の計算結果である 300 が出力される
print(res(20))

このコードを実行すると、300(つまり 20 × 15 の結果)が出力されます。

コードの動作を順番に解説

  1. 外側の関数 mulFunc:引数 num1 を受け取り、その内部で関数 mul を定義します。
  2. 内側の関数 mul:引数 num2 を受け取り、外側のスコープにある変数 num1 を参照して掛け算を行います。
  3. 関数オブジェクトの返却mulFuncmul の「呼び出し結果」ではなく、mul という関数そのものを返しています。
  4. 呼び出し時の挙動res = mulFunc(15) の時点で、num1 = 15 を記憶した関数が res に代入されます。その後 res(20) を呼び出すと、記憶していた 15 と渡された 20 を掛けて 300 が返されます。

この仕組みのポイント

注目すべきは、外側の関数 mulFunc の実行が終わった後でも、内側の関数 mul が外側のスコープの変数 num1 の値を覚えているという点です。これがクロージャの基本的な仕組みです。

このテクニックは、設定値を固定した新しい関数を作る「ファクトリ関数」や、Pythonを代表する機能である「デコレータ」の基礎にもなっており、実務でも頻繁に活用されています。

  1. PythonのBokehで画像を操作・表示する方法

    Pythonの可視化ライブラリBokehで画像を扱うには、image_url()メソッドを使い、画像URLのリストを渡すのが基本です。このメソッドを使うことで、ローカルやWeb上にある画像をプロット領域内に簡単に配置できます。実装の手順output_file()でデフォルトの出力先を設定し、show()を呼び出したときに結果がHTMLファイルとして保存されるようにします。figure()でプロット用の新しいFigure(図)オブジェクトを作成します。image_url()メソッドで、指定したURLから読み込んだ画像を描画します。show()を呼び出して、Bokehオブジェクトやアプリケーション

  2. Pythonで関数から別の関数を返す方法をわかりやすく解説

    Pythonは第一級関数(first-class functions)をサポートしているプログラミング言語です。実際、Pythonにおけるすべての関数は第一級オブジェクトとして扱われます。 これは何を意味するのでしょうか。具体的には、以下のようなことが可能になります。 関数の中から別の関数を返す(returnする) 関数をリストや辞書などのコレクションに格納する 関数を、通常の変数やオブジェクトと同じように扱う さらに、関数の中で別の関数を定義し、それを返すことさえできます。これはクロージャ(closure)と呼ばれる強力なテクニックの基礎にもなる概念です。 サンプルコード:関数内で関数を