回答編集履歴

1

追記

2018/12/03 07:56

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -32,6 +32,154 @@
32
32
 
33
33
 
34
34
 
35
+ #####理由
36
+
37
+ ぱっと思い付いた理由は、次の二つです。
38
+
39
+
40
+
41
+ **処理が関数の実装に影響されること**
42
+
43
+ 関数がグローバルなリストを返してくる恐れがあります。
44
+
45
+ 返り値を安心して使うためには、どちらにせよオブジェクトを再生成しなくてはいけません。
46
+
47
+
48
+
49
+ 例えば、こんなふうに関数が実装されていたとします。
50
+
51
+ ```Python
52
+
53
+ def function():
54
+
55
+ return lst
56
+
57
+ ```
58
+
59
+
60
+
61
+ 返り値の使い方に依っては、副作用が生じます。
62
+
63
+ ```Python
64
+
65
+ >>> lst = []
66
+
67
+ >>> ret = function()
68
+
69
+ >>> ret.append(42)
70
+
71
+ >>>
72
+
73
+ >>> print(lst)
74
+
75
+ [42]
76
+
77
+ >>> ret is lst
78
+
79
+ True
80
+
81
+ ```
82
+
83
+
84
+
85
+ ```Python
86
+
87
+ >>> lst = []
88
+
89
+ >>> ret = list(function())
90
+
91
+ >>> ret.append(42)
92
+
93
+ >>>
94
+
95
+ >>> print(lst)
96
+
97
+ []
98
+
99
+ >>> ret is lst
100
+
101
+ False
102
+
103
+ ```
104
+
105
+
106
+
107
+ ---
108
+
109
+ **遅延評価のメリットを潰しかねないこと**
110
+
111
+ 関数をジェネレータとして実装することで、パフォーマンスの向上を図ることができます。
112
+
113
+
114
+
115
+ 例えば、長い時間を要する処理を繰り返す関数があるとします。
116
+
117
+ そのような関数は、ジェネレータ関数として実装することで処理を分散するのが一般的です。
118
+
119
+ ```Python
120
+
121
+ def function():
122
+
123
+ for _ in range(3):
124
+
125
+ print('wasting time...')
126
+
127
+ yield 42
128
+
129
+ ```
130
+
131
+
132
+
133
+ 全体の実行時間は短縮されませんが、待ち時間の集中に依るストレスは幾分か緩和されます。
134
+
135
+ ```Python
136
+
137
+ >>> for e in function():
138
+
139
+ ... print('got e')
140
+
141
+ ...
142
+
143
+ wasting time...
144
+
145
+ got e
146
+
147
+ wasting time...
148
+
149
+ got e
150
+
151
+ wasting time...
152
+
153
+ got e
154
+
155
+ >>>
156
+
157
+ ```
158
+
159
+
160
+
161
+ 返り値をリストとして得たい場合は、呼び出し元で明示的に変換してやります。
162
+
163
+ ```Python
164
+
165
+ >>> lst = list(function())
166
+
167
+ wasting time...
168
+
169
+ wasting time...
170
+
171
+ wasting time...
172
+
173
+ >>>
174
+
175
+ ```
176
+
177
+
178
+
179
+ 最初からリストを返すような実装だと、目的に応じて使い分けられるメリットが潰れます。
180
+
181
+
182
+
35
183
  おまけ
36
184
 
37
185
  ---
@@ -73,3 +221,9 @@
73
221
  <map object at 0x7fe52abcf080> [3, -1, 2, 0.5]
74
222
 
75
223
  ```
224
+
225
+
226
+
227
+ Python2.7のmapはリストを返す仕様でした。
228
+
229
+ 3.0以降でイテレータを返す仕様に変更されたのは、前述の二番目の理由に依るものです。