Python の else 節



if 文の else 節
... 前の節の処理がスキップされた時に実行される。

while 文, for 文, try 文の else 節
... 前の節の処理がスキップされなかった時に実行される。

Python の else 節は if 文と、それ以外の while 文, for 文, try 文で、考え方が違います。なので、最初に if 文の else を習った後に while 文, for 文, try 文の else を見ると混乱します。

Effective Python では "項目12 for と while ループの後の else ブロックは使うのを避ける" と書かれていたので、try 文ではわかりませんが、for 文, while 文では、使わない方がいいかなと思います。

節の処理がスキップされた時に実行される。

0. if 文の else 節

if 文の else 節は if 節, elif 節が実行されず、処理がスキップされた時に、実行されます。

全ての式が偽になった場合、 else 節があれば、そのスイートが実行されます。
8.1. if 文 - Python 言語リファレンス

節の処理がスキップされなかった時に実行される。

1. for 文の else 節

for 文の else 節は for 節で break 文が実行されず、処理がスキップされなかった時に、実行されます。

全ての要素を使い切ったとき ...、else 節があればそれが実行され、ループは終了します。 最初のスイート内で break 文が実行されると、 else 節のスイートを実行することなくループを終了します。
8.3. for 文 - Python 言語リファレンス

# list の中身を比較する
def equal_list(lst1, lst2):
    lst1 = lst1.copy()
    for element in lst2:
        try:
            lst1.remove(element)
        except ValueError:
            break
    else:
        if not lst1:
            return True
    return False

equal_list([3, 7, 4, 5], [4, 5, 3, 7])
# True
2. while 文の else 節

while 文の else 節は while 節で break 文が実行されず、処理がスキップされなかった時に、実行されます。

else 節がある場合にはそれを実行し、ループを終了します。 最初のスイート内で break 文が実行されると、 else 節のスイートを実行することなくループを終了します。

3. try 文の else 節

try 文の else 節は try 節で例外が起こらず、処理がスキップされなかった時に、実行されます。

オプションの else 節は、実行の制御が try 節の末尾に到達した場合に実行されます。[2]
[2] 現在、制御が "末尾に到達する" のは、例外が発生したり、 return, continue, または break 文が実行される場合を除きます。
8.4. try 文 - Python 言語リファレンス

# list の差分を取る
def intersect_list(lst1, lst2):
    lst = []
    lst1 = lst1.copy()
    for element in lst2:
        try:
            lst1.remove(element)
        except ValueError:
            pass
        else:
            lst.append(element)
    return lst

intersect_list([3, 4, 5, 2], [4, 3, 6])
# [4, 3]

if 文と else 節

if 文は if, elif, else, また、その中で書かれた全ての式の集まり(スイート)をまとめたものを、指しています。

例えば if 文とは、次の箇所を指しています。また、このように複数行に渡って書かれる文を複合文と言います。try, while, for 文も複合文です。

if a = 0:   # <- if 文
    ...     # <- if 文
elif b = 1: # <- if 文
    ...     # <- if 文
else:       # <- if 文
    ...     # <- if 文


複合文の反対は、単純文です。1行で書かれる文です。break 文, return 文が該当します。

節 とはヘッダと、その配下の文や式の集まり(スイート)をまとめたものを指しています。例えば else 節といえば、次の箇所を指しています。

if a = 0:
    ...
elif b = 1:
    ...
else:       # <- else 節
    ...     # <- else 節

複合文は、一つ以上の '節 (clause)' からなります。節は、ヘッダと 'スイート (suite)' からなります。
8. 複合文 (compound statement)


式とは文の反対です。式は変数に代入できます。文は変数に代入できません。

# 式
sorted([3, 4, 1, 2])

# 代入できる
a = sorted([3, 4, 1, 2])
b = sorted([3, 4, 1, 2])


# 文
del a

# 代入できない
c = del b