teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

誤記

2019/01/07 12:13

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,4 +1,4 @@
1
- 追記: コメントでご指摘いただいたStopIterationに関して不自然と思える部分、MyIteratorの__next__の定義がおかしかった点を訂正いたしました。
1
+ 追記: コメントでご指摘いただいたStopIterationに関して不自然と思える部分、MyIteratorの`__next__`の定義がおかしかった点を訂正いたしました。
2
2
  ご指摘ありがとうございました。> hayataka2049さん、quiquiさん
3
3
 
4
4
  ---

2

StopIterationへの配慮を追加

2019/01/07 12:13

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,3 +1,7 @@
1
+ 追記: コメントでご指摘いただいたStopIterationに関して不自然と思える部分、MyIteratorの__next__の定義がおかしかった点を訂正いたしました。
2
+ ご指摘ありがとうございました。> hayataka2049さん、quiquiさん
3
+
4
+ ---
1
5
  for文の内部のメカニズムを考えると以下のようなヘンテコなコードが思い浮かびました。実際にやってみると動きました(Python3)。しかし自分は~~こんなコードを見たらプログラマーの正気を疑う~~このようなコードは推奨できないと思います...
2
6
 
3
7
  ```python
@@ -7,7 +11,7 @@
7
11
  if i == 3:
8
12
  next(loop_iter) # for文が次の要素4を求める前に事前に消費してしまう
9
13
  next(loop_iter) # さらに5も飛ばす
10
-
14
+ # 追記: ご指摘いただいたとおり、next(loop_iter, None)の方がよかったです。
11
15
  # ==>
12
16
  1
13
17
  2
@@ -41,20 +45,24 @@
41
45
  self.iterator = iter(iterable)
42
46
 
43
47
  def __next__(self, default=None):
44
- if default is None:
48
+ # if default is None:
45
- return next(self.iterator)
49
+ # return next(self.iterator)
46
- else:
50
+ # else:
47
- try:
51
+ # try:
48
- return next(self.iterator)
52
+ # return next(self.iterator)
49
- except StopIteration:
53
+ # except StopIteration:
50
- return default
54
+ # return default
55
+ # 上記実装はビルトイン関数nextの機能を誤って__next__に持たせてしまっており
56
+ # 誤りだったと思います。単に以下のようにする方が妥当と思います。
57
+ self.iterator.__next__()
51
58
 
52
59
  def skip(self, n):
53
60
  for _ in range(n):
54
- try:
61
+ # try:
55
- next(self.iterator)
62
+ # next(self.iterator)
56
- except StopIteration:
63
+ # except StopIteration:
57
- break
64
+ # break
65
+ next(self.iterator, None) # ご指摘から、よりシンプルな記述に変更しました
58
66
 
59
67
  def __iter__(self):
60
68
  return self

1

表現変更

2019/01/07 12:12

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,4 +1,4 @@
1
- for文の内部のメカニズムを考えると以下のようなヘンテコなコードが思い浮かびました。実際にやってみると動きました(Python3)。しかし自分はこんなコードを見たらプログラマーの正気を疑うと思います...
1
+ for文の内部のメカニズムを考えると以下のようなヘンテコなコードが思い浮かびました。実際にやってみると動きました(Python3)。しかし自分は~~こんなコードを見たらプログラマーの正気を疑う~~このようなコードは推奨できないと思います...
2
2
 
3
3
  ```python
4
4
  loop_iter = iter(range(1, 11))