Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。
Q&A
解決済
2回答
1219閲覧
総合スコア7
0グッド
0クリップ
投稿2019/12/22 10:06
0
def make_incrementor(n): ... return lambda x: x + n ... f = make_incrementor(42) f(1) 43 上記の通り実行してなぜ43が出力されるのか分かりません。 xの値がどこから来ているのかが理解できず苦しんでいます。 ご教授お願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
質問へのコメント
回答2件
lambda x: x + nというのが、引数xを受け取って:に続く式を評価した結果を返す関数オブジェクトになる式です(lambda式と呼ばれます)。
lambda x: x + n
x
:
以下のコードが概ね等価です。lambda式を見慣れていなければ、こちらで考えても良いでしょう。
python1def make_incrementor(n): 2 def f(x): 3 """make_incrementorが呼び出されるとき動的に生成される関数オブジェクト 4 そのときのnが名前空間に束縛されている(クロージャ) 5 """ 6 return x + n 7 return f
python
1def make_incrementor(n): 2 def f(x): 3 """make_incrementorが呼び出されるとき動的に生成される関数オブジェクト 4 そのときのnが名前空間に束縛されている(クロージャ) 5 """ 6 return x + n 7 return f
投稿2019/12/22 10:18
総合スコア30939
回答へのコメント
2019/12/23 00:50
ベストアンサー
lambda は無名関数です。通常の関数定義にすると以下のように書いたのと同じ意味です。
python1def make_incrementor(n): 2 def add(x): 3 return x + n 4 return add 5 6f = make_incrementor(42) 7print(f(1))
1def make_incrementor(n): 2 def add(x): 3 return x + n 4 return add 5 6f = make_incrementor(42) 7print(f(1))
f には add関数が代入されています。 add関数の引数が x なので、f(1) で add(1) を呼んだことになります。 add関数では x と n を加算しますが、加算する n は最初に呼ばれたときの 42 が記憶されています。 1 + 42 で 43 になります。
このように、内部的に値を閉じ込めて保持しておく関数内関数をクロージャーと言います。
投稿2019/12/22 10:17
総合スコア5407
2019/12/23 00:51
2019/12/23 01:21
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
15分調べてもわからないことはteratailで質問しよう!
ただいまの回答率85.29%
質問をまとめることで思考を整理して素早く解決
テンプレート機能で簡単に質問をまとめる
Pythonチュートリアルを読んでいて理解できない部分がありました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/23 00:50