python
1def add_sound(stroke): 2 def inner(): 3 return stroke + '-->パコーン' 4 return inner 5a = add_sound('バックハンドストローク')
秀和システムのpythonプログラミングパーフェクトマスターに載ってるコードを書きました。クロージャーを学んだのですが、これを実行するときに
python
1a()
と入力することでクロージャーが実行できるとのことでした。このa()の()はなんなのですか?
aの時は「バックハンドストローク」というパラメータが既に入っているから()のなかは空欄でいいのか?と思い、a('スマッシュ')と入力したのですが、
python
1Traceback (most recent call last): 2 File "<pyshell#16>", line 1, in <module> 3 a('スマッシュ') 4TypeError: inner() takes 0 positional arguments but 1 was given
とエラーが出ました。
このa()の()は何を意味しているのでしょうか?
関数内関数と一緒に記されていて
python
1def add_sound(stroke): 2 def inner(s): 3 return s + 'パコーン' 4 return inner(stroke) 5a=add_sound('フォアハンドストローク')
に対して
python
1a
で実行できました。
使用用途の違いについてや、クロージャーでのa()の()の意味について教えてください。
追記
a()のかっこについて、__call__を呼び出しているに過ぎないということがわかりました
>引用元
object.call(self[, args...])
インスタンスが関数として "呼ばれた" 際に呼び出されます; このメソッドが定義されている場合、 x(arg1, arg2, ...) は x.call(arg1, arg2, ...) を短く書いたものになります。
>pythonサイト
少し難しいのですが
python
1a('スマッシュ')
で実行できないことについて、決まった引数でしか実行できないのでしょうか?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
今回の私の質問について私の解釈を記します。
python
1def add_sound(stroke): 2 def inner(): 3 return stroke + '-->パコーン' 4 return inner 5a = add_sound('バックハンドストローク')
について、a はこのコードの4行目return innerからinnerという関数を得ているから
python
1type(a) 2>>>class 'function'
と帰ってきている。
もう一つ、同じテキストで次のようなコードが載っていたので、試してみました。
python
1def add_sound2(attack): 2 for i in range(5): 3 print(attack,'--> パッコーン') 4 return attack 5 6b = add_sound2('スマッシュ') 7 8type(b) 9>>>class 'str' 10 11b 12>>>'スマッシュ' 13b() 14>>>TypeError: 'str' object is not callable
bという変数では引数が'スマッシュ’であるadd_sound2()という関数に結びついていて、return attackよりattackが戻り値として帰ってきている。attackという変数についてadd_sound2を実行する際に'スマッシュ'というstrが入れられているため、bを参照すると'スマッシュ'が表示された。
今回テーマのクロージャではinnerという関数を返していることで同じ処理をa()という形で何度も処理できるということですね
ほんとに何度も追記質問を繰り返してすみませんでした。非常に理解が深まりました!!
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/16 21:45
2020/05/16 23:25
2020/05/17 08:58
2020/05/17 10:11
2020/05/17 13:52