Python/条件分岐と繰り返し

Python の制御構造には、逐次・分岐・繰返しの3つがあり。このうち逐次はプログラムが左上から左から右・上から下に進む当たり前の状態ですので、これ以上の説明は必要ないと思います。
Pythonでは条件分岐をするために if 文あるいは match 文を使います。
Pythonでは条件分岐をするために if 文を使います。基本的な形は以下のようになります:
例えば、ある変数 x の値に基づいて条件分岐する場合を考えてみましょう:
この場合、x の値が10なので、最初の条件と最後の条件のどちらも満たされますが、最初の条件が先に評価されます。そのため、"xは10です" と出力されます。
条件分岐を使うことで、プログラムが特定の条件下で異なる動作をするように制御することができます。
Python 3.10以降では、match文が導入されました。match文は、特定の値に基づいてパターンをマッチングし、対応するブロックを実行するのに使用されます。match文は、複数の値や条件を一度に比較し、コードをより読みやすくし、処理をシンプルにするのに役立ちます。
以下は、match文の基本的な使い方です:
この例では、x の値に応じて異なる処理を行います。match文では、caseキーワードを使用して値やパターンを指定し、そのパターンがマッチした場合に対応するブロックが実行されます。また、case _:のように_を使用することで、どのケースにもマッチしない残りのケースを処理することができます。
さらに、match文では複数の条件やパターンをまとめて処理することもできます。例えば、タプルやリスト、または|演算子を使用して複数の条件を指定できます:
この例では、(0, 0)ならば原点、(x, y)でxとyが同じなら同じ値、(x, _)でxが正の値なら正の値、それ以外のケースを処理します。
match文はパターンマッチングを使用して柔軟な条件分岐を行うのに役立ちます。これにより、コードの読みやすさと保守性を向上させることができます。
条件式はプログラミングで特定の条件が成立するかどうかを判定するために使われます。Pythonでは、if文を使って条件式を評価し、条件が真である場合に特定のコードブロックを実行します。
基本的な構文は以下のようになります:
elseは省略可能で、条件が偽の場合に何も実行しないようにすることができます。
Pythonでは比較演算子や論理演算子を使って条件式を組み立てることができます。主な比較演算子は以下の通りです:
例えば:
さらに、複数の条件を組み合わせるために論理演算子を使用できます:
例えば:
このようにして、条件式を使うことでプログラム内で特定の条件が成立するかどうかを判断し、それに応じた処理を行うことができます。
in演算子はPythonで非常に便利な演算子の1つです。in演算子は特定の要素がコレクション(リスト、タプル、文字列など)に含まれているかどうかをチェックするのに使います。
例えば、リスト内に特定の要素が含まれているかを確認する場合に使えます:
同様に、文字列内で特定の部分文字列が存在するかを確認することもできます:
in演算子は、リストや文字列の他にも、辞書や集合などのコレクションでの要素の存在をチェックするのに役立ちます。条件式にin演算子を使うことで、特定の要素がコレクションに含まれているかどうかを簡単に判断できます。
Pythonの条件式では、整数、文字列、リストなどのさまざまなデータ型を使用することができます。条件式では、その値が真か偽かを判定します。
整数を条件式として使用する場合、0は偽として扱われ、0以外の整数は真として扱われます。例えば:
ここでは、xが0以外の値(真)を持っているため、"xは真です"と出力されます。
文字列やリストなどのシーケンスも条件式として使用できます。空の文字列や空のリストは偽として扱われます。例えば:
上記の場合、my_stringとmy_listの両方が空なので、"空です"と出力されます。
このように、Pythonの条件式では値が真か偽かを判定し、それに基づいてコードを実行することができます。整数、文字列、リストなど、さまざまなデータ型を条件式として使用することで、柔軟な条件分岐を行うことができます。
Pythonのif文は、条件に基づいてコードの実行を制御するためのものでしたが、Python3.8からはif式(または三項演算子)が導入されました。if式は、1行で条件に応じて値を返すことができます。
if式の基本的な構文は以下の通りです:
これは、条件が真の場合にvalue_if_trueを返し、偽の場合にvalue_if_falseを返します。
例えば、次のように使えます:
この場合、xが偶数なら"Even"が、奇数なら"Odd"が出力されます。
このように、if式を使うと簡潔に条件に応じて値を設定したり、返したりすることができます。特に、1行で簡潔に条件式を表現したい場合に便利です。
内包表記とif式は、Pythonでコードを短く、効率的に書くための強力な機能です。
内包表記は、リスト、集合、辞書などのデータ構造を構築するための簡潔な方法です。if式を内包表記に組み込むことで、特定の条件を満たす要素のみを含むリストや集合を生成できます。
リスト内包表記でifを使う例を見てみましょう:
このコードでは、numbersリストから偶数のみを取り出してeven_numbersリストを生成しています。リスト内包表記の中でifを使用することで、条件に合致する要素だけを含むリストを作成できます。
同様に、辞書内包表記や集合内包表記でもif式を使用できます。例えば:
これらの例は、内包表記を使って条件に基づいてリスト、辞書、集合を生成する方法を示しています。if式を内包表記に組み込むことで、コンパクトで読みやすいコードを書くことができます。
Python 3.10 から、パターンマッチングを行う match 文がサポートされました。
正規表現の match メソッドとは別です。
match文は、2021年に導入された新しい機能で、3.9以前のバージョンのpythonではmatch文は使えません。
Pythonの match 文で使用されるパターンは、以下のようなものがあります。
以下で、それぞれについて詳しく解説します。
value パターンは、値が等しいかどうかを比較するためのパターンです。以下は、例です。
この例では、color という変数に格納された値に応じて、条件分岐を行っています。case "red": は、color が "red" と等しい場合にマッチします。
ワイルドカードパターンは、どの値にもマッチするパターンです。ワイルドカードパターンは、_ という記号で表現します。
ガードパターンは、条件式が True である場合にマッチするパターンです。ガードパターンは、if キーワードを使って表現します。
type パターンは、型が等しいかどうかを比較するためのパターンです。以下は、例です。
この例では、value という変数に格納された値の型に応じて、条件分岐を行っています。case int: は、value の型が整数型の場合にマッチします。
as パターンは、値を別名で参照するためのパターンです。以下は、例です。
この例では、value という変数に格納された値の型に応じて、条件分岐を行っています。case int as n: は、value の型が整数型の場合にマッチし、value の値を n という名前で参照することができます。
orパターンは、二つのパターンのいずれかにマッチする場合に使用されます。例えば、次のように使用します。
listパターンは、リストに対してマッチする場合に使用されます。次のように、リストの要素を一つ一つマッチングします。
tupleパターンは、タプルに対してマッチする場合に使用されます。リストの場合と同様に、タプルの要素を一つ一つマッチングします。
dictパターンは、辞書に対してマッチする場合に使用されます。次のように、辞書のキーと値を一つ一つマッチングします。
classパターンは、特定のクラスのインスタンスに対してマッチする場合に使用されます。次のように、クラス名を指定して、クラスのインスタンスにマッチングします。
Pythonのシーケンスパターンは、リスト、タプル、文字列、バイト列のようなシーケンス型のデータをマッチングするために使用されます。シーケンスパターンは、複数の要素を一度にマッチングするために使用され、組み込みの結合演算子を使用して複数のパターンを結合することができます。
以下は、シーケンスパターンを使用してリストをマッチングする例です。
上記の例では、my_listが4つの異なるパターンにマッチするように定義されています。最初のパターン [1, 2, 3]は、my_listが要素が1, 2, 3のリストである場合にマッチします。2番目のパターン [1, _, _]は、my_listが最初の要素が1で、次の2つの要素が何であってもマッチします。3番目のパターン [1, *rest]は、my_listが最初の要素が1である場合にマッチし、*restはリストの残りの部分をキャプチャします。最後のパターン _は、どのリストにもマッチするため、最後のパターンは常に True を返します。
シーケンスパターンは、パターンの部分を任意の式で置き換えることができるため、マッチングされた要素にアクセスして処理を実行することができます。例えば、以下の例ではリストの最初の2つの要素にアクセスしていることがわかります。
この例では、xとyは最初の2つの要素を表し、restは残りのリストを表します。 rest はキーワードではありませんが、レストパターンを引き受ける変数の名前としてよく使われます。
match文の最初の例は、辞書を使って下のように書き換えることができます。
Python 3.4からは、enumモジュールが標準ライブラリとして提供されています。
以下は、enumパッケージを使用した簡単な例です。
このように、Enumを継承したクラスを作成し、クラス属性として定数を定義することで、独自の列挙型を定義できます。 上記の例では、Colorという列挙型を定義し、RED、GREEN、BLUEという3つの定数を定義しています。
列挙型を使用すると、例えばColor.REDというように、定数に直接アクセスすることができます。
また、列挙型はforループを使って列挙することができます。
match文と組み合わせると、列挙型の値に基づいた処理を簡潔に記述できます。
Python 3.10以降では、enumパッケージにauto()という新しい機能が導入されました。これにより、列挙型に自動的に連番の値を割り当てることができます。
上記のコードでは、auto()を使用して列挙型に自動的に連番の値を割り当てています。結果として、Color.REDは1、Color.GREENは2、Color.BLUEは3の値を持ちます。
Pythonには、さまざまな繰り返しの方法があります。主なものは for ループと while ループです。
for ループは、リスト、タプル、辞書、集合などのイテラブル(要素を一つずつ取り出せるオブジェクト)を繰り返し処理するのに使います。
リストの例:
fruitsリスト内の各要素を順番に取り出して、その要素をfruitという変数に格納してループ内で使用しています。
辞書の例:
items()メソッドを使って辞書のキーと値のペアを取得し、keyとvalueにそれぞれ格納しています。
while ループは指定された条件が真の間、繰り返し処理を実行します。
この例では、countが5未満の場合にループが実行され、countの値が表示されます。count += 1によってcountが1ずつ増加します。
:=演算子はPython 3.8で導入された「セイウチ演算子(Walrus operator)」として知られています。これは式内で変数に値を代入するためのもので、通常の代入文とif文を組み合わせたような構文を、より簡潔に記述できるようにします。
例えば、whileループでの使用方法を見てみましょう:
この例では、input()関数を使ってユーザーから数値を入力し、:=演算子を使用して同時にinput_valueに代入しています。そして、入力された値が0でない限り、ループは継続され、totalに入力値を加算し続けます。入力された数値が0であればループは終了し、最終的な合計値が表示されます。
この演算子は、ループ内で変数を初めて定義する際や、式内で一時的な変数を使う場合などに特に便利です。ただし、適切に使うことでコードの読みやすさを損なわないように注意が必要です。
breakやcontinueなどの制御構造も使えます。breakはループを抜け出し、continueはループの現在のイテレーションをスキップして次のイテレーションに進みます。
この例では、continueはiが3のときに処理をスキップし、breakはiが8のときにループを抜けます。
これらの方法を使って、Pythonで繰り返し処理を行う機能を活用することができます。
while文あるいはfor文がbreak文で中断しなかった場合、forにつづくelse節が実行されます。else節は、大概のプログラミング言語ではif文と組合わせて使いますが、Pythonではこれに加え繰返し(while文あるいはfor文)と組合わせることができます。
Pythonでは、ループはスコープを作りません。