teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

追記

2020/05/17 13:49

投稿

fL8kZjyKQi2NEst
fL8kZjyKQi2NEst

スコア7

title CHANGED
File without changes
body CHANGED
@@ -44,4 +44,41 @@
44
44
  ```python
45
45
  a('スマッシュ')
46
46
  ```
47
- で実行できないことについて、決まった引数でしか実行できないのでしょうか?
47
+ で実行できないことについて、決まった引数でしか実行できないのでしょうか?
48
+
49
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
50
+ 今回の私の質問について私の解釈を記します。
51
+ ```python
52
+ def add_sound(stroke):
53
+ def inner():
54
+ return stroke + '-->パコーン'
55
+ return inner
56
+ a = add_sound('バックハンドストローク')
57
+ ```
58
+ について、a はこのコードの4行目return innerからinnerという関数を得ているから
59
+ ```python
60
+ type(a)
61
+ >>>class 'function'
62
+ ```
63
+ と帰ってきている。
64
+ もう一つ、同じテキストで次のようなコードが載っていたので、試してみました。
65
+ ```python
66
+ def add_sound2(attack):
67
+ for i in range(5):
68
+ print(attack,'--> パッコーン')
69
+ return attack
70
+
71
+ b = add_sound2('スマッシュ')
72
+
73
+ type(b)
74
+ >>>class 'str'
75
+
76
+ b
77
+ >>>'スマッシュ'
78
+ b()
79
+ >>>TypeError: 'str' object is not callable
80
+ ```
81
+ bという変数では引数が'スマッシュ’であるadd_sound2()という関数に結びついていて、return attackよりattackが戻り値として帰ってきている。attackという変数についてadd_sound2を実行する際に'スマッシュ'というstrが入れられているため、bを参照すると'スマッシュ'が表示された。
82
+ 今回テーマのクロージャではinnerという関数を返していることで同じ処理をa()という形で何度も処理できるということですね
83
+
84
+ ほんとに何度も追記質問を繰り返してすみませんでした。非常に理解が深まりました!!

1

追記

2020/05/17 13:49

投稿

fL8kZjyKQi2NEst
fL8kZjyKQi2NEst

スコア7

title CHANGED
File without changes
body CHANGED
@@ -32,4 +32,16 @@
32
32
  a
33
33
  ```
34
34
  で実行できました。
35
- 使用用途の違いについてや、クロージャーでのa()の()の意味について教えてください。
35
+ 使用用途の違いについてや、クロージャーでのa()の()の意味について教えてください。
36
+
37
+ **追記**
38
+ a()のかっこについて、__call__を呼び出しているに過ぎないということがわかりました
39
+ >[引用元](https://www.nooozui.com/entry/20191108/1573147328)
40
+ object.__call__(self[, args...])
41
+ インスタンスが関数として "呼ばれた" 際に呼び出されます; このメソッドが定義されている場合、 x(arg1, arg2, ...) は x.__call__(arg1, arg2, ...) を短く書いたものになります。
42
+ >[pythonサイト](https://docs.python.org/ja/3/reference/datamodel.html)
43
+ 少し難しいのですが
44
+ ```python
45
+ a('スマッシュ')
46
+ ```
47
+ で実行できないことについて、決まった引数でしか実行できないのでしょうか?