概要
switch ステートメントは、プログラムのフローを制御するための強力で便利なツールです。これにより、指定された変数または式の値に応じて、コードの複数の分岐を迅速かつ簡単に作成できます。これは、2 つを超える (ただし有限数の) 値を持つことができる特定の変数の値に応じて異なるロジックを実行する必要がある場合によく使用されます。
この記事では、Python で switch ステートメントを使用する方法を検討し、他の制御構造と比較したその利点について説明します。 Python を初めて使用する場合でも、経験豊富な開発者であっても、switch ステートメントはよりクリーンで効率的なコードを作成するのに役立ちます。
v3.10以前
Python switch ステートメントが言語でネイティブに使用できるようになる前は、プログラマーは同じ機能を実現するために他の制御構造を使用する必要がありました。一般的なアプローチの 1 つは、コードの各分岐をテスト対象の変数の異なる値に関連付けて、一連の if-else ステートメントを使用することでした。
たとえば、次のコードについて考えてみます。
value = "foo"
if value == "foo":
print("foo was selected")
elif value == "bar":
print("bar was selected")
else:
print("Nothing valid was selected")
このコードでは、if-else ステートメントを使用して、変数の値に基づいてコードのどの分岐を実行するかを決定しています。 value
。 場合 value
が「foo」に等しい場合、コードの最初の分岐が実行されます。もし value
が「bar」に等しい場合、コードの 2 番目の分岐が実行されます。それ以外の場合は、 else
ブロックが実行されます。
このアプローチは機能しますが、変数に取り得る値の数が増えると、すぐに扱いにくくなる可能性があります。さらに、コードが読みにくくなり、理解しにくくなる可能性があります。
Python で switch のようなステートメントを作成するために使用できるもう 1 つのアプローチは、辞書を使用することです。このアプローチでは、辞書のキーはテスト対象の変数の取り得る値であり、その値は対応するコードの分岐です。
たとえば、次のコードについて考えてみます。
value = "foo"
switch = {
"foo": lambda: print("foo was selected"),
"bar": lambda: print("bar was selected"),
"default": lambda: print("Nothing valid was selected"),
}
switch.get(value, "default")()
このコードでは、という辞書を定義しました。 switch
、変数の取り得る値を表すキー付き value
。各キーに対して、対応するコード分岐を含むラムダ関数を値として割り当てました。コードの適切なブランチを実行するには、 get()
ディクショナリのメソッド。これにより、指定されたキーがディクショナリに存在しない場合に使用するデフォルト値を指定できます。
このアプローチは、if-else ステートメントを使用するよりも柔軟でコンパクトですが、特に各ブランチのコードが複雑な場合には、読み取って理解するのが難しい場合があります。さらに、ラムダ関数を使用する必要があるため、一部のプログラマにとっては混乱する可能性があります。何らかの理由でこの記事の他の方法を使用できない場合を除き、この方法を使用することはお勧めしません。
Python v3.10 での Python switch ステートメントの導入により、プログラマーは、特定の変数または式の値に基づいてプログラムのフローを制御する、より便利で直感的な方法を利用できるようになりました。次のセクションでは、Python で実際の switch ステートメントを使用する方法を検討します。
match
/case
ステートメント (v3.10 以降)
Python v3.10 以降、switch ステートメントは match
キーワード。このキーワードは、パターン マッチング式を作成するために使用されます。これにより、指定された変数または式の値を一連のパターンに対してテストできます。一致するものが見つかった場合、コードの対応する分岐が実行されます。
たとえば、次のコードについて考えてみます。
value = "foo"
match value:
case "foo":
print("foo was selected")
case "bar":
print("bar was selected")
case _:
print("Nothing valid was selected")
ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!
このコードでは、 match
キーワードを使用して、変数の値をテストするパターン マッチング式を作成します。 value
一連のパターンに対して。もし value
が「foo」に等しい場合、コードの最初の分岐が実行されます。もし value
が「bar」に等しい場合、コードの 2 番目の分岐が実行されます。それ以外の場合は、else ブロック内のコードが実行されます。
フォールスルー
Python の switch ステートメントと他の言語の従来の switch ステートメントとの主な違いの 1 つは、Python の switch ステートメントと match
ステートメントはフォールスルーをサポートしていません。つまり、一致が見つかり、コードの対応する分岐が実行されると、 match
式が終了しており、他のコードはありません match
ステートメントが実行されます。他の言語では、これは通常、 break
キーワード。ここでは必要またはサポートされていません。
従来の switch ステートメントでフォールスルーと同じ動作を実現したい場合は、 |
複数のケースに一致する演算子。この演算子を使用すると、1 つの関数で複数のパターンを指定できます。 case
、任意のパターンに一致して、そのブランチの実行をトリガーできます。
たとえば、次のコードについて考えてみます。
value = "y"
match value:
case "yes" | "y":
print("The user confirmed")
case _:
print("The user denied")
ここで、次の値が value
「はい」に等しい or 「y」、コードの最初の分岐が実行されます。これは、従来の switch ステートメントのフォールスルー動作と同等です。
デフォルト
上記の例でお気づきかと思いますが、「デフォルト」の場合はアンダースコア (_
)。これは「ワイルドカード」とみなされ、すべての値と一致します。前述のいずれかのケースが値に一致する場合、デフォルトのコード分岐はスキップされ、実行されません。
まとめ
ご覧のとおり、Python の match (別名「switch」) ステートメントは、プログラムのフローを制御する強力かつ便利な方法を提供します。 Python を初めて使用する場合でも、経験豊富な開発者であっても、switch ステートメントはよりクリーンで効率的なコードを作成するのに役立ちます。