回答編集履歴
3
誤記
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
追記: コメントでご指摘いただいたStopIterationに関して不自然と思える部分、MyIteratorの__next__の定義がおかしかった点を訂正いたしました。
|
1
|
+
追記: コメントでご指摘いただいたStopIterationに関して不自然と思える部分、MyIteratorの`__next__`の定義がおかしかった点を訂正いたしました。
|
2
2
|
ご指摘ありがとうございました。> hayataka2049さん、quiquiさん
|
3
3
|
|
4
4
|
---
|
2
StopIterationへの配慮を追加
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
|
-
|
49
|
+
# return next(self.iterator)
|
46
|
-
else:
|
50
|
+
# else:
|
47
|
-
|
51
|
+
# try:
|
48
|
-
|
52
|
+
# return next(self.iterator)
|
49
|
-
|
53
|
+
# except StopIteration:
|
50
|
-
|
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
|
-
|
62
|
+
# next(self.iterator)
|
56
|
-
except StopIteration:
|
63
|
+
# except StopIteration:
|
57
|
-
|
64
|
+
# break
|
65
|
+
next(self.iterator, None) # ご指摘から、よりシンプルな記述に変更しました
|
58
66
|
|
59
67
|
def __iter__(self):
|
60
68
|
return self
|
1
表現変更
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))
|