• Skip to main content
  • Skip to secondary menu
  • Skip to primary sidebar
  • Skip to footer

AI活用エンジニアへの道

生成AI時代のエンジニアの生き方を考えるメディア(作成途中)

  • コラム
  • 生成AI
  • プログラミング
    • Python入門
    • Flask入門
    • Django入門
  • プロフィール
Home / プログラミング / Python / Pythonの内部関数(inner function)、ノンローカル変数の使用方法、クロージャの定義方法詳細

Pythonの内部関数(inner function)、ノンローカル変数の使用方法、クロージャの定義方法詳細

1 内部関数(inner function)の使い方
2 内部関数でのnonlocalの使い方
3 内部関数を用いたクロージャの定義
4 関連記事

内部関数(inner function)の使い方

pythonでは、関数の内部に関数を書くことができる。これを内部関数と言います。また、ノンローカル変数(nonlocal)として宣言すると内側の関数から外側の関数で宣言された変数を書き換えられるようになる。

  • inner関数の書き方
def outer():
  def innner():
    # inner関数の処理
  # inner関数を呼び出す等outer関数で行う

内部関数でのnonlocalの使い方

pythonではノンローカル変数という変数があり、内部関数の名前空間から外部関数の名前空間にある変数にアクセスすることができる。
(ノンローカル変数についてはこちらでも記述してある)

  • nonlocalを使わない場合(外部の関数の値は変更されない)
def outer():
    def inner():
        outer_value = '内側で変更'

    outer_value = '外' 
    inner() # inner関数を呼び出す
    print(outer_value) # 「外」と表示
    return outer_value

value = outer()

print(value) # '外'と表示(外部の関数の値は変更される)

  • nonlocalを使う場合
def outer():
    def inner():
        nonlocal outer_value # nonlocalを宣言
        outer_value = '内側で変更' # 外側の関数の名前空間のouter_valueに'内側で変更'が代入される

    outer_value = '外'
    inner() # inner関数を呼び出す
    print(outer_value) # 「内側で変更」と表示
    return outer_value

value = outer()

print(value)

内部関数を用いたクロージャの定義

前述の通り、内部関数からは外部の関数の変数にアクセスして値を変更することはできないが、参照することはできる。
以下のように利用する。

  • 内部関数から外部の変数へのアクセス
def outer():
    outer_value = '外'
    def inner():
        print(outer_value) # 外と表示
    inner()
    return outer_value

value = outer()

内部関数のこの性質を用いて、クロージャを作成する。
クロージャとは、

  • 関数とその周囲の環境への参照の組み合わせ

のことを言う。

以下のようにすると、関数(inner)と周囲の環境(name)の組み合わせを返すことができる

  • クロージャの定義
def outer():
    name = 'Taro'
    def inner():
        print(name) # nameを参照
    return inner # 内部関数を返す

function = outer() # クロージャを変数functionに代入

function() # functionを実行

呼び出す際に、外部の変数に値を代入することができる。

  • 外部の変数に値を代入
def outer(name):
    name = name
    def inner():
        print(name) # nameを参照
    return inner # 内部関数を返す

function = outer('Jiro') # outerを引数Jiroにして呼び出し、クロージャを変数functionに代入

function() # functionを実行

関数を渡して、内部関数内で実行することもできる。
以下のように記述する。

  • 内部関数に関数を渡す
def outer(func):
    def inner(*args):
        print(func(*args)) # funcを用いて引数*argで実行する
    return inner

def add(x, y):
    return x + y

def sub(x, y):
    return x-y

add_func = outer(add) # funcに関数addを入れてクロージャを返す
sub_func = outer(sub) # funcに関数subを入れてクロージャを返す

add_func(3, 3) # args=(3,3)でprint(add(*args))が実行され、6と表示
add_func(4, 5) # args=(4,5)でprint(add(*args))が実行され、9と表示

sub_func(10, 5) # args=(10,5)でprint(sub(*args))が実行され、5と表示
sub_func(20, 10) # args=(20,10)でprint(sub(*args))が実行され、10と表示

関連記事

Pythonの型ヒント:コレクション型とOptional型の使い方
Pythonの型ヒント:コレクション型とOptional型の…
Python型ヒントについて、変数と関数の引数と戻り値に付与する基本的な書き方について
Python型ヒントについて、変数と関数の引数と戻り値に付与…
【まとめ】よく使うLinuxのショートカット11選
【まとめ】よく使うLinuxのショートカット11選
覚えておくべきLinuxコマンド50選
覚えておくべきLinuxコマンド50選
FlaskでFormを用いてPOSTリクエストを行い、送信された値を取得する
FlaskでFormを用いてPOSTリクエストを行い、送信さ…
Flaskでabortを用いてHTTPException例外を強制的に発生させる
Flaskでabortを用いてHTTPException例外…

Primary Sidebar

人気記事

  • 1
    ITエンジニアとしてスキルを高めるためのUdemy講…
  • 2
    PyCharm,IntelliJのおすすめプラグイン一覧
  • no image 3
    Python未経験だが、フリーランスの案件に採用さ…
  • 4
    アメリカのシリコンバレーでプログラミングを無…

特集記事

  • 1
    Cursorの使用のポイントとコツ(コード補完、イ…
  • 2
    ITエンジニアとしてスキルを高めるためのUdemy講…

目次

1 内部関数(inner function)の使い方
2 内部関数でのnonlocalの使い方
3 内部関数を用いたクロージャの定義
4 関連記事
StartCode ロゴ
AI時代のエンジニアを最速で育てる
法人向けIT研修で即戦力を育成しています。詳しくはお問い合わせください。
▶ 詳細はこちら
Python講座
【Udemy】Python入門講座(0からPythonの基礎を体系的に学んで、生成AIでバイブコーディング)
受講生3000人ほどの人気講座。<strong>Pythonの基礎から生成AI活用</strong>...
詳細 ▶

Footer

利用規約