Pythonでのループ文でのelseの使い方

2194 ワード

本文はPythonのfor...elseとwhile...else文法を議論し,これはPythonの中で最もよく使われず,最も誤解されている文法特性の一つである.
Pythonのfor、whileループには、if文やtry文のようにオプションのelseブランチがあり、ループ反復が正常に完了した後に実行されます.すなわち、通常の方法以外の任意の方法でループを終了しない場合、elseブランチは実行されます.すなわち,ループ内にbreak文がない,return文がない,あるいは異常がない.簡単な(無駄な)例を考えてみましょう.
>>> for i in range(5):
...     print(i)
... else:
...     print('Iterated over everything :)')
...
0
1
2
3
4
Iterated over everything :)

上記のコードでは、range(5)で各数値を反復して印刷します.ループを正常に完了させるため、elseブランチも実行され、Iterated over everything:)が印刷されます.逆に、break文でループを終了すると、elseブランチは実行されません.
>>>foriinrange(5):
...    ifi==2:
...        break
...    print(i)
...else:
...    print('Iterated over everything :)')
...
0
1

ループが反復するシーケンスが空であるにもかかわらず、elseブランチは依然として実行され、結局、ループは正常に完了している.
>>> for i in []:
...     print(i)
... else:
...     print('Still iterated over everything (i.e. nothing)')
...
Still iterated over everything (i.e. nothing)

同じように忘れないでください.以上もwhile...elseに適応しています.
Python
>>>i=0
>>>whilei<=5:
...    i+=1
...    printi
...else:
...    print'Yep'
...
1
2
3
4
5
Yep

でも、なんで!?
else文のループでの一般的な使用例は、ループ検索を実現することです.特定の条件を満たすアイテム(item)を検索し、追加の処理を行う必要があるか、許容できる値が見つからない場合にエラーを生成します.
for x in data:
    if meets_condition(x):
        break
else:
    # raise error or do additional processing

else文がない場合は、フラグを設定し、後で検出して条件を満たす値があるかどうかを判断する必要があります.
Python
condition_is_met=False
forxindata:
    ifmeets_condition(x):
        condition_is_met=True
 
ifnotcondition_is_met:
    # raise error or do additional processing

これは本当に重要なものではありませんが、多くの他の言語ではそうしなければなりません.しかし、Pythonの他の多くの特性と同様に、else文はより優雅なPythonスタイルの(Pythonic)コードを生成することができます.上記の例では、else文を使用してコードをよりThe Zen of Pythonに友好的にすることは間違いありません.
これは、ループでelse文を使用しなければならないわけではありません.いつもフラグなどを使用することができます.しかしelse文は、コードをより優雅に、より読み取り可能にすることが多い.これでPythonicが意図をより明確にしたと思うかもしれません(ハイ!)しかし、他の人はこのように迷いがあり、冗長だと思っているかもしれません.個人的には、別のより可読性のある方法が存在しない限り、else文をループで使用することを堅持します(私にとって、コードの可読性が最も重要だと思います).
転載先:http://python.jobbole.com/81063/