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