回答編集履歴
2
追記
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
### 普通にクラスにする
|
6
6
|
|
7
7
|
けっきょく、欲しいものは閉じた名前空間のあるオブジェクト。普通に考えたらインスタンスです。
|
8
8
|
|
@@ -66,7 +66,7 @@
|
|
66
66
|
|
67
67
|
|
68
68
|
|
69
|
-
|
69
|
+
### 引数のデフォルト値を活用する
|
70
70
|
|
71
71
|
デフォルト値が実行時(関数定義時)評価なのがキモ。
|
72
72
|
|
@@ -110,7 +110,7 @@
|
|
110
110
|
|
111
111
|
|
112
112
|
|
113
|
-
|
113
|
+
### 単に外のスコープに置く
|
114
114
|
|
115
115
|
|
116
116
|
|
@@ -134,7 +134,7 @@
|
|
134
134
|
|
135
135
|
|
136
136
|
|
137
|
-
|
137
|
+
### 関数オブジェクトの属性に押し込む
|
138
138
|
|
139
139
|
この方法は汚いので非推奨ですが・・・
|
140
140
|
|
@@ -180,4 +180,86 @@
|
|
180
180
|
|
181
181
|
|
182
182
|
|
183
|
-
記述量だけならクロージャより少なくて済むのが強みです。
|
183
|
+
記述量だけならクロージャより少なくて済むのが強みです。引数のデフォルト値を使う方法には負けますが。
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
関数に呼び出しをまたいで変化する状態を持たせるような用途だと、この方法は輝きます。デフォルト値では(たぶん)できないからです。
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
これとクロージャでカウンタを書いた例。
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
```python
|
196
|
+
|
197
|
+
# クロージャ版
|
198
|
+
|
199
|
+
def make_f(init):
|
200
|
+
|
201
|
+
def f():
|
202
|
+
|
203
|
+
nonlocal init # 必須
|
204
|
+
|
205
|
+
init += 1
|
206
|
+
|
207
|
+
return init
|
208
|
+
|
209
|
+
return f
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
f = make_f(0)
|
214
|
+
|
215
|
+
for i in range(5):
|
216
|
+
|
217
|
+
print(f())
|
218
|
+
|
219
|
+
""" =>
|
220
|
+
|
221
|
+
1
|
222
|
+
|
223
|
+
2
|
224
|
+
|
225
|
+
3
|
226
|
+
|
227
|
+
4
|
228
|
+
|
229
|
+
5
|
230
|
+
|
231
|
+
"""
|
232
|
+
|
233
|
+
|
234
|
+
|
235
|
+
# 属性版
|
236
|
+
|
237
|
+
def f():
|
238
|
+
|
239
|
+
f.init += 1
|
240
|
+
|
241
|
+
return f.init
|
242
|
+
|
243
|
+
f.init = 0
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
for i in range(5):
|
248
|
+
|
249
|
+
print(f())
|
250
|
+
|
251
|
+
""" =>
|
252
|
+
|
253
|
+
1
|
254
|
+
|
255
|
+
2
|
256
|
+
|
257
|
+
3
|
258
|
+
|
259
|
+
4
|
260
|
+
|
261
|
+
5
|
262
|
+
|
263
|
+
"""
|
264
|
+
|
265
|
+
```
|
1
修正
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
- 普通にクラスにする
|
6
6
|
|
7
|
-
けっきょく、欲しいものは閉じた名前空間。普通に考えたらインスタンスです。
|
7
|
+
けっきょく、欲しいものは閉じた名前空間のあるオブジェクト。普通に考えたらインスタンスです。
|
8
8
|
|
9
9
|
|
10
10
|
|