質問編集履歴

2

追記

2020/05/17 13:49

投稿

fL8kZjyKQi2NEst
fL8kZjyKQi2NEst

スコア7

test CHANGED
File without changes
test CHANGED
@@ -91,3 +91,77 @@
91
91
  ```
92
92
 
93
93
  で実行できないことについて、決まった引数でしか実行できないのでしょうか?
94
+
95
+
96
+
97
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
98
+
99
+ 今回の私の質問について私の解釈を記します。
100
+
101
+ ```python
102
+
103
+ def add_sound(stroke):
104
+
105
+ def inner():
106
+
107
+ return stroke + '-->パコーン'
108
+
109
+ return inner
110
+
111
+ a = add_sound('バックハンドストローク')
112
+
113
+ ```
114
+
115
+ について、a はこのコードの4行目return innerからinnerという関数を得ているから
116
+
117
+ ```python
118
+
119
+ type(a)
120
+
121
+ >>>class 'function'
122
+
123
+ ```
124
+
125
+ と帰ってきている。
126
+
127
+ もう一つ、同じテキストで次のようなコードが載っていたので、試してみました。
128
+
129
+ ```python
130
+
131
+ def add_sound2(attack):
132
+
133
+ for i in range(5):
134
+
135
+ print(attack,'--> パッコーン')
136
+
137
+ return attack
138
+
139
+
140
+
141
+ b = add_sound2('スマッシュ')
142
+
143
+
144
+
145
+ type(b)
146
+
147
+ >>>class 'str'
148
+
149
+
150
+
151
+ b
152
+
153
+ >>>'スマッシュ'
154
+
155
+ b()
156
+
157
+ >>>TypeError: 'str' object is not callable
158
+
159
+ ```
160
+
161
+ bという変数では引数が'スマッシュ’であるadd_sound2()という関数に結びついていて、return attackよりattackが戻り値として帰ってきている。attackという変数についてadd_sound2を実行する際に'スマッシュ'というstrが入れられているため、bを参照すると'スマッシュ'が表示された。
162
+
163
+ 今回テーマのクロージャではinnerという関数を返していることで同じ処理をa()という形で何度も処理できるということですね
164
+
165
+
166
+
167
+ ほんとに何度も追記質問を繰り返してすみませんでした。非常に理解が深まりました!!

1

追記

2020/05/17 13:49

投稿

fL8kZjyKQi2NEst
fL8kZjyKQi2NEst

スコア7

test CHANGED
File without changes
test CHANGED
@@ -67,3 +67,27 @@
67
67
  で実行できました。
68
68
 
69
69
  使用用途の違いについてや、クロージャーでのa()の()の意味について教えてください。
70
+
71
+
72
+
73
+ **追記**
74
+
75
+ a()のかっこについて、__call__を呼び出しているに過ぎないということがわかりました
76
+
77
+ >[引用元](https://www.nooozui.com/entry/20191108/1573147328)
78
+
79
+ object.__call__(self[, args...])
80
+
81
+ インスタンスが関数として "呼ばれた" 際に呼び出されます; このメソッドが定義されている場合、 x(arg1, arg2, ...) は x.__call__(arg1, arg2, ...) を短く書いたものになります。
82
+
83
+ >[pythonサイト](https://docs.python.org/ja/3/reference/datamodel.html)
84
+
85
+ 少し難しいのですが
86
+
87
+ ```python
88
+
89
+ a('スマッシュ')
90
+
91
+ ```
92
+
93
+ で実行できないことについて、決まった引数でしか実行できないのでしょうか?