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

回答編集履歴

1

追記

2021/09/15 12:07

投稿

8524ba23
8524ba23

スコア38350

answer CHANGED
@@ -7,4 +7,82 @@
7
7
  > 全ての要素を使い切ったとき (シーケンスが空であったり、イテレータが StopIteration 例外を送出したときは、即座に)、 else 節があればそれが実行され、ループは終了します。
8
8
 
9
9
  listのサイズが0、すなわち`シーケンスが空`である場合は**即座に**ループは終了します。
10
- すなわちループ内の処理は実行されません。
10
+ すなわちループ内の処理は実行されません。
11
+
12
+ # 追記
13
+
14
+ むしろ以下コードで示すような変態クラスも想定すると`len`なりでチェックする**べきではなく**
15
+ 単純に`for in`に任せた方がよいかもしれません。
16
+ 参考:[Pythonはどうやってlen関数で長さを手にいれているの?](https://www.slideshare.net/shimizukawa/how-does-python-get-the-length-with-the-len-function)
17
+
18
+ ```Python
19
+ class MyIterator:
20
+ def __init__(self,obj):
21
+ self.obj = obj
22
+ self.c = 0
23
+
24
+ # ここが変態
25
+ def __len__(self):
26
+ print('__len__')
27
+ return 0
28
+
29
+ def __next__(self):
30
+ print('__next__')
31
+ try:
32
+ r = self.obj[self.c]
33
+ self.c += 1
34
+ return r
35
+ except IndexError:
36
+ self.c = 0
37
+ raise StopIteration
38
+
39
+ def __iter__(self):
40
+ print('__iter__')
41
+ return self
42
+
43
+ def disp(it):
44
+ print('disp')
45
+ for e in it:
46
+ print(e)
47
+
48
+ for l in [[],[1,2]]:
49
+ print(l)
50
+ it = MyIterator(l)
51
+
52
+ print('just disp')
53
+ disp(it)
54
+
55
+ print('check len')
56
+ if len(it) > 0:
57
+ disp(it) # 呼ばれない
58
+
59
+ print('check if')
60
+ if it:
61
+ disp(it)# 呼ばれない
62
+
63
+
64
+ """
65
+ []
66
+ just disp
67
+ disp
68
+ __iter__
69
+ __next__
70
+ check len
71
+ __len__
72
+ check if
73
+ __len__
74
+ [1, 2]
75
+ just disp
76
+ disp
77
+ __iter__
78
+ __next__
79
+ 1
80
+ __next__
81
+ 2
82
+ __next__
83
+ check len
84
+ __len__
85
+ check if
86
+ __len__
87
+ """
88
+ ```