回答編集履歴

2

追記

2018/08/26 00:13

投稿

hayataka2049
hayataka2049

スコア30933

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

修正

2018/08/26 00:13

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  - 普通にクラスにする
6
6
 
7
- けっきょく、欲しいものは閉じた名前空間。普通に考えたらインスタンスです。
7
+ けっきょく、欲しいものは閉じた名前空間のあるオブジェクト。普通に考えたらインスタンスです。
8
8
 
9
9
 
10
10