1. ホーム
  2. スクリプト・コラム
  3. パイソン

for elseの特殊機能を学ぶpythonの入門編

2022-01-26 10:34:24

どのプログラミング言語でも "if-else" は書きますが、"for-else" はどうでしょう?

cやc++、Javaなど多くの言語では、ループの後に"else"を使うことは完全に間違っています。しかし、エレガントな言語であるPythonは、この奇妙だが便利な機能を備えている。正しく使えば、私たちのコードはもっとすっきりするはずです。

For-Else機能の基礎知識

Pythonの開発者が初めて"for-else"機能に出会ったとき、それは奇妙で理解しがたいものに見えます。しかし、実際にはその使い方は驚くほど簡単です。ループにブレークがないときだけ" else"ブロックが実行される、という一文で十分説明できます。

嘘のように簡単?例題で検証してみよう。

leaders = ["Elon", "Tim", "Warren"]
for i in leaders:
    if i == "Yang":
        print("Yang is a leader!")
        break
else:
    print("Not found Yang!")
# Not found Yang!


上で見たように、リストリーダーには "Yang" が含まれていないため、for ループにブレークがありません。したがって、"else"ブロックが実行され、メッセージが表示されます。

もし、Leadersに"Yang"が含まれていたら、どうなりますか?

leaders = ["Yang", "Elon", "Tim", "Warren"]
for i in leaders:
    if i == "Yang":
        print("Yang is a leader!")
        break
else:
    print("Not found Yang!")
# Yang is a leader!


上記のように、"Yang"がリーダーリストにあるため、forループは壊れており、"else"ブロックは実行されていません。

つまり、for-else機能は、理解するのは難しくないが、正しく上手に使うのは簡単ではないということだ。

For-Else機能を使用する3つのシナリオ

Pythonのプログラムでは、必ずしもfor-else機能を使用する必要はありません。正直なところ、使わなくても同じことができるのですが、使うことでコードがよりエレガントになります。

1. フラグ変数のない項目を反復して探す

特定の項目を見つけるためにリストを反復することは、ループを使用するための基本的な解決策です。通常、項目が見つかったら、反復を続けるのは意味がないので、ループを解除する必要があります。問題は、項目が見つかったかどうかをどのようにして知るかです。

従来の解決策は、"flag" 変数を定義して、特定の項目が見つかったときに True に設定することです。

leaders = ["Yang", "Elon", "Tim", "Warren"]
have_yang = False
for i in leaders:
    if i == "Yang":
        have_yang = True
        # Do something
        break
if have_yang == False: # no yang
    ...  # Do others


この方法でも十分なのですが、Pythonをフルに活用したい場合。for-elseの機能を使うのも一つの手です。

leaders = ["Yang", "Elon", "Tim", "Warren"]
for i in leaders:
    if i == "Yang":
        have_yang = True
        # Do something
        break
else: # no yang
    ...  # Do others


そのほうが簡単で便利でしょう?

2. ネストしたループの解除を支援

for-else機能は、ネストしたループがある場合にも有効です。

for i in range(5):
    for j in range(5):
        if j == 2 and i == 0:
            break
    if not (j == 2 and i == 0):
        continue
    break 


上で見たように、ネストしたループを壊すのは少し難しいです。なぜなら、内側のループが壊れているかどうかを知る必要があるからです。

上のコードは、内側のループが壊れているかどうかを判断するための不器用な解決策を示したものです。確かに機能するが、for-elseの機能を使えばもっとすっきりさせることができる。

# use the for-else syntax
for i in range(5):
    for j in range(5):
        if j == 2 and i == 0:
            break
    else: # only execute when it's no break in the inner loop
        continue
    break


3. 例外処理に関するヘルプ

例外処理はプログラミングをする上で非常に重要で、for-else機能を正しく使えば、役に立つことがある。例えば

nums = [1, 3, 0, 5]
for denominator in nums:
    try:
        20/denominator
    except ZeroDivisionError:
        break
else: # no found ZeroDivisionError
    ...  # Do others


上記のように、forループでZeroDivisionErrorが発生しなければ、"else"ブロックで対応するアクションを実行することが可能です。

まとめ

Pythonのfor-else機能は、最初、奇妙に思えるかもしれません。しかし、理解するのは難しくありませんし、場合によってはとても便利な機能です。結局のところ、1文のルールを覚えておけばいいのです:"else"ブロックはループに切れ目がないときだけ実行されます。

以上、pythonのfor elseの特殊な機能について詳しく説明しました。pythonのfor elseの特殊な機能については、Scripting Houseの他の関連記事も参考にしてください