回答編集履歴

4

追記に関して

2018/04/12 07:49

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -173,3 +173,107 @@
173
173
  ```
174
174
 
175
175
  ご覧の通り可読性は悪いのですが、できなくはありません。
176
+
177
+
178
+
179
+ ### 質問の追記に関して
180
+
181
+ 恐らくzipや内包表記が入り乱れているのでわかりづらいのだと思います。
182
+
183
+ ナイーブに書くとこうなります。
184
+
185
+
186
+
187
+ ```python
188
+
189
+ def count_diff(true_ans, exam_ans):
190
+
191
+ """同じ文字列長を仮定
192
+
193
+ """
194
+
195
+ diff_count = 0
196
+
197
+ for i in range(len(true_ans)):
198
+
199
+ if true_ans[i] != exam_ans[i]:
200
+
201
+ diff_count += 1
202
+
203
+ return diff_count
204
+
205
+ ```
206
+
207
+
208
+
209
+ これはたぶん追っていけばわかるはずです。
210
+
211
+ ついでにzipの出力も確認しておくことにしましょう。
212
+
213
+
214
+
215
+
216
+
217
+ ```python
218
+
219
+ >>> list(zip("head", "hhhh"))
220
+
221
+ [('h', 'h'), ('e', 'h'), ('a', 'h'), ('d', 'h')]
222
+
223
+ ```
224
+
225
+
226
+
227
+ あとはリスト内包表記にするだけで、これは簡単です。
228
+
229
+ ```python
230
+
231
+ sum([1 for c1, c2 in zip(right_answer, answer) if c1 != c2])
232
+
233
+ ```
234
+
235
+
236
+
237
+ ただしLouiS0616さんのこのコードは、
238
+
239
+
240
+
241
+ ```python
242
+
243
+ diff = sum(
244
+
245
+ 1 for ra, a in zip(right_answer, answer) if ra != a
246
+
247
+ )
248
+
249
+ ```
250
+
251
+
252
+
253
+ 0. リスト内包表記ではなくジェネレータ式を使っている
254
+
255
+ 1. ジェネレータ式を関数の引数として書く場合、かっこを省略できるという糖衣構文を使っている
256
+
257
+
258
+
259
+ ので一見すると理解しがたいものに見えます。
260
+
261
+
262
+
263
+ 1については、ジェネレータ式はジェネレータを作るものです。ジェネレータとはなにかというと、だいたい次のようなポジションだと思ってください。
264
+
265
+
266
+
267
+ - イテレータ:forで繰り返し処理できるもの。文字列、リスト、タプル、"ジェネレータ"など
268
+
269
+ - ジェネレータ:動的に要素が生成されるイテレータ
270
+
271
+
272
+
273
+ 2については、本来ジェネレータ式は()で囲うことで作ることができるのですが、関数の唯一の引数として渡された場合はこの()を省略できるというルールがあります。それを使われています。
274
+
275
+
276
+
277
+ 参考:
278
+
279
+ [ジェネレータ式の文法について調べてみた ](http://www.rhoboro.com/2017/07/08/python-generator-grammer.html)

3

誤字修正

2018/04/12 07:49

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -144,7 +144,7 @@
144
144
 
145
145
 
146
146
 
147
- すっきりしたといえばすっきりしましたが、コード行数は大して減ってはいないという見方もできるでしょう。だけど、これ以上複雑なことをやるとかえって見通しが悪くなるので、これくらいで良いのです。
147
+ すっきりしたといえばすっきりしましたが、コード行数は大して減ってはいないという見方もできるでしょう。だけど、これ以上複雑なことをやるとかえって見通しが悪くなるので、これくらいで良いのです。
148
148
 
149
149
 
150
150
 

2

編集

2018/04/12 05:00

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -144,7 +144,7 @@
144
144
 
145
145
 
146
146
 
147
- すっきりしたといえばすっきりした、コード行数は大して減ってはいないという見方もできるでしょう。でもコードの素直さとか読みやすさを損なってまで短より、この方が良い場合も多いのです。
147
+ すっきりしたといえばすっきりしまし、コード行数は大して減ってはいないという見方もできるでしょう。だけどれ、これ以上複雑なこをやるとって見通しが悪ので、これくらいで良いのです。
148
148
 
149
149
 
150
150
 

1

追記

2018/04/12 05:00

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -149,3 +149,27 @@
149
149
 
150
150
 
151
151
  余談ですが、本当は私が先に思いついたのは下の例の方です。「まずは1問だけ採点する関数を作ろう。そうすれば、あとはできたも同然だ。そのために、まずは異なり文字数を数える関数を作るか」というような発想で書きました。参考にしてください。
152
+
153
+
154
+
155
+ ### 追記
156
+
157
+ 「lambda式は複雑な処理にはあまり適しません」と書いてしまいましたが、あえてlambdaバージョンのsaitenを作ってみた例。
158
+
159
+ ```python
160
+
161
+ saiten = lambda true_ans, exam_ans:(
162
+
163
+ 0
164
+
165
+ if len(true_ans) != len(exam_ans) else
166
+
167
+ (lambda count_diff:(
168
+
169
+ [2, 1][count_diff] if count_diff <= 1 else 0))(
170
+
171
+ sum([1 for c1, c2 in zip(true_ans, exam_ans) if c1 != c2])))
172
+
173
+ ```
174
+
175
+ ご覧の通り可読性は悪いのですが、できなくはありません。