listのサイズが0なら、forの中身を実行しないことは、いつも期待していいのでしょうか。
はい。以下抜粋します。
8.3. for 文
全ての要素を使い切ったとき (シーケンスが空であったり、イテレータが StopIteration 例外を送出したときは、即座に)、 else 節があればそれが実行され、ループは終了します。
listのサイズが0、すなわちシーケンスが空
である場合は即座にループは終了します。
すなわちループ内の処理は実行されません。
追記
むしろ以下コードで示すような変態クラスも想定するとlen
なりでチェックするべきではなく
単純にfor in
に任せた方がよいかもしれません。
参考:Pythonはどうやってlen関数で長さを手にいれているの?
Python
1class MyIterator:
2 def __init__(self,obj):
3 self.obj = obj
4 self.c = 0
5
6 # ここが変態
7 def __len__(self):
8 print('__len__')
9 return 0
10
11 def __next__(self):
12 print('__next__')
13 try:
14 r = self.obj[self.c]
15 self.c += 1
16 return r
17 except IndexError:
18 self.c = 0
19 raise StopIteration
20
21 def __iter__(self):
22 print('__iter__')
23 return self
24
25def disp(it):
26 print('disp')
27 for e in it:
28 print(e)
29
30for l in [[],[1,2]]:
31 print(l)
32 it = MyIterator(l)
33
34 print('just disp')
35 disp(it)
36
37 print('check len')
38 if len(it) > 0:
39 disp(it) # 呼ばれない
40
41 print('check if')
42 if it:
43 disp(it)# 呼ばれない
44
45
46"""
47[]
48just disp
49disp
50__iter__
51__next__
52check len
53__len__
54check if
55__len__
56[1, 2]
57just disp
58disp
59__iter__
60__next__
611
62__next__
632
64__next__
65check len
66__len__
67check if
68__len__
69"""
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/15 12:05
2021/09/15 12:10 編集
2021/09/15 23:24