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 の結果)が出力されます。
コードの動作を順番に解説
- 外側の関数 mulFunc:引数
num1を受け取り、その内部で関数mulを定義します。 - 内側の関数 mul:引数
num2を受け取り、外側のスコープにある変数num1を参照して掛け算を行います。 - 関数オブジェクトの返却:
mulFuncはmulの「呼び出し結果」ではなく、mulという関数そのものを返しています。 - 呼び出し時の挙動:
res = mulFunc(15)の時点で、num1 = 15を記憶した関数がresに代入されます。その後res(20)を呼び出すと、記憶していた 15 と渡された 20 を掛けて 300 が返されます。
この仕組みのポイント
注目すべきは、外側の関数 mulFunc の実行が終わった後でも、内側の関数 mul が外側のスコープの変数 num1 の値を覚えているという点です。これがクロージャの基本的な仕組みです。
このテクニックは、設定値を固定した新しい関数を作る「ファクトリ関数」や、Pythonを代表する機能である「デコレータ」の基礎にもなっており、実務でも頻繁に活用されています。
-
PythonのBokehで画像を操作・表示する方法
Pythonの可視化ライブラリBokehで画像を扱うには、image_url()メソッドを使い、画像URLのリストを渡すのが基本です。このメソッドを使うことで、ローカルやWeb上にある画像をプロット領域内に簡単に配置できます。実装の手順output_file()でデフォルトの出力先を設定し、show()を呼び出したときに結果がHTMLファイルとして保存されるようにします。figure()でプロット用の新しいFigure(図)オブジェクトを作成します。image_url()メソッドで、指定したURLから読み込んだ画像を描画します。show()を呼び出して、Bokehオブジェクトやアプリケーション
-
Pythonで関数から別の関数を返す方法をわかりやすく解説
Pythonは第一級関数(first-class functions)をサポートしているプログラミング言語です。実際、Pythonにおけるすべての関数は第一級オブジェクトとして扱われます。 これは何を意味するのでしょうか。具体的には、以下のようなことが可能になります。 関数の中から別の関数を返す(returnする) 関数をリストや辞書などのコレクションに格納する 関数を、通常の変数やオブジェクトと同じように扱う さらに、関数の中で別の関数を定義し、それを返すことさえできます。これはクロージャ(closure)と呼ばれる強力なテクニックの基礎にもなる概念です。 サンプルコード:関数内で関数を