1. ホーム
  2. python

[解決済み] なぜpythonはforやwhileループの後に'else'を使うのですか?

2022-03-02 03:43:37

質問

この構成がどのように機能するかは理解しています。

for i in range(10):
    print(i)

    if i == 9:
        print("Too big - I'm giving up!")
        break
else:
    print("Completed successfully")

しかし、なぜ else がキーワードとして使われているのは、問題のコードが for ブロックが完了しないと、その逆になってしまうのです どう考えても、私の脳みそでは for ステートメントから else ブロックを作成します。私にとっては continue または continuewith の方が筋が通っていると思います(そう読めるように訓練中です)。

Pythonのコーダーはこの構成をどのように頭の中で(あるいは声に出して)読んでいるのか気になるところです。もしかしたら、私はこのようなコードブロックをもっと簡単に解読できるような何かを見逃しているのでしょうか?

どのように解決するのですか?

Pythonのベテランコーダーにとっても、これは不思議な構造です。forループと一緒に使うと、基本的には "イテラブルの中のある項目を見つけ、何も見つからなかったら..."を意味します。というような意味です。

found_obj = None
for obj in objects:
    if obj.key == search_key:
        found_obj = obj
        break
else:
    print('No object found.')

しかし、この構成を見る限り、より良い代替案は、検索を関数にカプセル化することです。

def find_obj(search_key):
    for obj in objects:
        if obj.key == search_key:
            return obj

またはリスト内包を使用する。

matching_objs = [o for o in objects if o.key == search_key]
if matching_objs:
    print('Found {}'.format(matching_objs[0]))
else:
    print('No object found.')

他の2つのバージョンと意味的に同等ではありませんが、リスト全体を反復処理するかどうかが重要でないパフォーマンスクリティカルでないコードでは十分に機能します。他の人はそう思わないかもしれませんが、私自身はプロダクションコードでfor-elseやwhile-elseブロックを使うのは絶対に避けたいと思っています。

参照 [Python-ideas] for...elseスレッドのまとめ