nonlocal
ノンローカル(モジュールとパッケージ)
意味 内側の関数から変更
nonlocalとは?
nonlocal文は、Pythonのプログラムで、ネストされた関数(関数の中にさらに定義された関数)の中で、外側の関数の変数を操作したいときに使われます。nonlocal文を使わないと、内側の関数で同じ名前のローカル変数が作られてしまい、外側の関数の変数を変更できません。
nonlocalの具体的な使い方
カウンタークロージャの実装
def create_counter():
count = 0
def increment():
nonlocal count
count += 1
return count
def decrement():
nonlocal count
count -= 1
return count
def get_count():
return count
return {
"increment": increment,
"decrement": decrement,
"get_count": get_count
}
# カウンターを作成
counter = create_counter()
# カウンターを操作
print(counter["increment"]()) # 1を出力
print(counter["increment"]()) # 2を出力
print(counter["decrement"]()) # 1を出力
print(counter["get_count"]()) # 1を出力
👇出力結果
1
2
1
1
この例では、`nonlocal`キーワードを使ってクロージャ内のカウンター変数を操作するカウンターを実装しています。`create_counter`関数は、カウントを増やす`increment`関数、減らす`decrement`関数、現在のカウントを取得する`get_count`関数を含む辞書を返します。各関数内で`nonlocal count`を使用することで、外部関数の`count`変数を直接操作できます。
状態を持つデコレータの実装
def count_calls(func):
call_count = 0
def wrapper(*args, **kwargs):
nonlocal call_count
call_count += 1
print(f"{func.__name__}関数は{call_count}回目の呼び出しです。")
return func(*args, **kwargs)
return wrapper
@count_calls
def greet(name):
return f"こんにちは、{name}さん!"
# 関数を複数回呼び出す
print(greet("太郎"))
print(greet("花子"))
print(greet("次郎"))
👇出力結果
greet関数は1回目の呼び出しです。
こんにちは、太郎さん!
greet関数は2回目の呼び出しです。
こんにちは、花子さん!
greet関数は3回目の呼び出しです。
こんにちは、次郎さん!
この例では、`nonlocal`キーワードを使って関数の呼び出し回数を追跡するデコレータを実装しています。`count_calls`デコレータは、内部に`call_count`変数を持ち、デコレートされた関数が呼び出されるたびにこの変数をインクリメントします。`wrapper`関数内で`nonlocal call_count`を使用することで、外部関数の`call_count`変数を直接操作できます。
nonlocalに関するよくある質問
nonlocalが学べる書籍の紹介
「プログラミング単語帳」を使って、プログラミングの単語を英単語のように学習してみませんか?
プログラミング単語帳には、Pythonのnonlocalやfrom package.subpackage import module、import、from . import module、などのような実務でよく使われる単語が数百以上収録されています。
この書籍には、プログラミングの単語の意味や読み方、単語の使い方がわかる例文などが掲載されており、いつでもどこでもプログラミングの学習ができます。
よく使われる単語にだけ絞って学習することができるので、効率的にプログラミングが学習できます。
HTML編、CSS編、JavaScript編、PHP編、Ruby編、その他単語編の6シリーズ分が公式ストアにて販売中です。気になった方はぜひ購入してみてください。
Pythonを学べる「プログラミング単語帳」アプリ
プログラミング単語帳がアプリになりました!Pythonはもちろん、10種類のプログラミング言語の中から、よく使われる単語をスマホで学習できます。
収録単語は2,000単語以上!
現在は、HTML、CSS、JavaScirpt、PHP、Laravel、Ruby、Python、MySQL、Linux、など10カテゴリーの単語帳が1つのアプリに収録されています。
いつでも、どこでも、隙間時間を有効活用して、プログラミングを効率的に学べるので、ぜひダウンロードしてみてください。
2024年7月アップデート情報:「Laravel」カテゴリーが追加されましました!
2024年8月アップデート情報:「MySQL」「Linux」カテゴリーが追加されましました!