Python 制御フロー

PythonBeginner

はじめに

制御フロー(Control flow)とは、個々のステートメント、命令、または関数呼び出しが実行または評価される順序のことです。Python プログラムの制御フローは、条件文、ループ、および関数呼び出しによって制御されます。

この実験(Lab)では、Python におけるプログラム実行を制御するためのコアコンセプトを学習します。if文を使用した条件ロジック、さまざまな演算子、新しいmatch-case文、そしてwhileループとforループを使用したイテレーション(反復処理)を探求します。この実験の終わりまでに、より動的で強力な Python プログラムを作成できるようになるでしょう。

比較演算子とブール演算子

このステップでは、比較演算子と論理演算子を使用して論理式を構築する方法を学びます。これらの式は、True または False のいずれかに評価され、プログラムの制御フローの基礎となります。

比較演算子 (Comparison Operators)

比較演算子は、2 つの値を比較するために使用されます。一般的な比較演算子の表を以下に示します。

演算子 意味
== 等しい (Equal to)
!= 等しくない (Not equal to)
< 未満 (Less than)
> より大きい (Greater Than)
<= 以下 (Less than or Equal to)
>= 以上 (Greater than or Equal to)

これらの演算子は True または False を返します。例えば、42 == 42 は True ですが、42 == '42' は型(整数と文字列)が異なるため False となります。

論理演算子 (Boolean Operators)

3 つの論理演算子があります:and、or、not です。これらはブール値(真偽値)を結合したり反転させたりするために使用されます。それらの優先順位は、not、次に and、最後に or の順です。

and 演算子は、両方の式が真である場合にのみ True を返します。 or 演算子は、少なくとも一方の式が真であれば True を返します。 not 演算子は、ブール値を反転させます (not True は False になります)。

演算子の組み合わせ

比較演算子と論理演算子を組み合わせることで、より複雑な論理式を作成できます。

注記: WebIDE (VS Code のようなもの) の使用に慣れていない場合は、まずこの実験 (lab) で学習してください。

例えば、次のようになります。

(4 < 5) and (5 < 6)

出力:

True

それでは、これを練習しましょう。左側のファイルエクスプローラーから operators_example.py ファイルを開いてください。以下のコードをファイルに追加します。このコードは複数の演算子を組み合わせて単一のブール結果を評価します。

## operators_example.py
result = 2 + 2 == 4 and not 2 + 2 == 5 and 2 * 2 == 2 + 2
print(result)

スクリプトを実行するには、WebIDE でターミナルを開き、次のコマンドを実行します。

python3 operators_example.py

式全体が True に評価されるため、次のような出力が表示されるはずです。

True

If ステートメントと三項演算子

このステップでは、特定の条件に基づいてコードブロックを実行するために、if文、elif文、else文を使用してプログラムフローを制御する方法を学びます。また、簡潔な一行の条件式を書くための三項条件演算子(ternary conditional operator)についても紹介します。

if文、elif文、else文

  • if文は、その条件がTrueの場合にコードブロックを実行します。
  • elif(else if)文は、先行するifまたはelifの条件がFalseであった場合に、別の条件をチェックします。
  • else文は、すべての先行するifおよびelifの条件がFalseであった場合にコードブロックを実行します。

基本的な構造は次のとおりです。

if condition1:
    ## condition1 が True の場合に実行されるコード
elif condition2:
    ## condition1 が False で、かつ condition2 が True の場合に実行されるコード
else:
    ## すべての条件が False の場合に実行されるコード

三項条件演算子 (Ternary Conditional Operator)

三項演算子は、単純なif-else文を一行で記述するための短縮形を提供します。その構文は次のとおりです。

<expression1> if <condition> else <expression2>

例えば、print('kid' if age < 18 else 'adult')は、完全なif-elseブロックを記述する簡潔な方法です。

それでは、完全な条件ブロックの使用を練習しましょう。if_example.pyファイルを開き、以下のコードを追加します。このスクリプトは、name変数の値をチェックし、それに応じて異なるメッセージを出力します。

## if_example.py
name = 'Antony'

if name == 'Debora':
   print('Hi Debora!')
elif name == 'George':
   print('Hi George!')
else:
   print('Who are you?')

ターミナルからスクリプトを実行します。

python3 if_example.py

nameが'Antony'であるため、if条件もelif条件も満たされないため、elseブロックが実行されます。

出力:

Who are you?

Switch Case ステートメント

このステップでは、Python 3.10 で導入された強力な switch-case 相当の機能である構造的パターンマッチング(Structural Pattern Matching)について探ります。matchキーワードとcaseキーワードを使用して、値のマッチング、OR パターンの使用、およびデフォルトケースの実装を練習します。

match文は式を取り、その値を 1 つ以上のcaseブロックとして与えられた連続するパターンと比較します。

基本的なマッチング

数値や文字列などのリテラル値に対してマッチングを行うことができます。

OR パターン

|(または)演算子を使用して、単一のcase内で複数のリテラルパターンを組み合わせることができます。例えば、case 200 | 201:のように記述します。

デフォルトケース

アンダースコア記号(_)はワイルドカードであり、他のどのケースにもマッチしなかった場合にマッチするデフォルトケースを定義するために使用されます。

これを練習しましょう。match_example.pyファイルを開き、以下のコードを追加します。このスクリプトは、HTTP 応答コードに基づいてアクションを決定するためにmatch文を使用します。

## match_example.py
response_code = 800

match response_code:
    case 200 | 201:
        print("OK")
    case 300 | 307:
        print("Redirect")
    case 400 | 401:
        print("Bad Request")
    case 500 | 502:
        print("Internal Server Error")
    case _:
        print("Invalid Code")

ターミナルからスクリプトを実行します。

python3 match_example.py

response_codeが800であるため、特定されたどのケースにもマッチせず、デフォルトケース(_)が実行されます。

出力:

Invalid Code

While ループとループ制御

このステップでは、条件が真である限り繰り返し実行するためのwhileループを習得します。また、ループを終了するためのbreak文と、現在のイテレーションをスキップするためのcontinue文を使用して、ループの動作を管理する方法を学びます。

whileループ

whileループは、与えられた条件がTrueである限り、ターゲットのステートメントを繰り返し実行します。無限ループを避けるために、条件が最終的にFalseになるようにすることが重要です。

break文

break文は、現在のループを終了し、C 言語における従来のbreakと同様に、次のステートメントで実行を再開します。

continue文

continue文は、ループの現在のイテレーション内の残りのすべてのステートメントを拒否し、制御をループの先頭に戻します。

簡単なwhileループを作成してみましょう。while_example.pyファイルを開き、以下のコードを追加します。このスクリプトはメッセージを 5 回出力します。

## while_example.py
spam = 0
while spam < 5:  ## spam が 5 未満の間、継続
    print('Hello, world.')
    spam = spam + 1  ## 無限ループを避けるためにカウンターをインクリメント

次に、ターミナルからスクリプトを実行します。

python3 while_example.py

spamが 5 未満である限り、ループは実行されます。各イテレーションで、spamは 1 ずつインクリメントされます。

出力:

Hello, world.
Hello, world.
Hello, world.
Hello, world.
Hello, world.

For ループとイテレーション

このステップでは、リストや文字列などのシーケンス内のアイテムを反復処理するためにforループを使用します。このステップでは、特定の回数ループするためにrange()関数を使用する方法、forループにおけるオプションのelseブロック、およびsys.exit()を使用してプログラムを完全に終了する方法について説明します。

forループ

forループは、シーケンス(リスト、タプル、辞書、セット、または文字列のいずれか)を反復処理するために使用されます。

range()関数

range()関数は数値のシーケンスを生成し、特定の回数ループする場合に便利です。

  • range(stop): 0 からstop(stopを含まない)までの数値を生成します。
  • range(start, stop): startからstopまでの数値を生成します。
  • range(start, stop, step): startからstopまでの数値を、stepで増分しながら生成します。

sys.exit()によるプログラムの終了

sys.exit()関数を呼び出すと、プログラムを即座に終了できます。これを使用するには、まずimport sysする必要があります。

range()を使用したforループの練習をしましょう。for_example.pyファイルを開き、以下のコードを追加します。このスクリプトは、0 から 8 までの偶数を出力します。

## for_example.py
## range(start, stop, step)
for i in range(0, 10, 2):
   print(i)

ターミナルからスクリプトを実行します。

python3 for_example.py

range(0, 10, 2)関数は、0 から始まり、10(10 を含まない)まで、ステップ 2 で数値を生成します。

出力:

0
2
4
6
8

まとめ

この実験(Lab)の完了、おめでとうございます!これで、Python における制御フローの基本概念を習得しました。

この実験(Lab)では、以下のことを学びました。

  • 比較演算子とブール演算子を使用して論理条件を形成する方法。
  • if、elif、elseステートメント、および簡潔な三項演算子を使用してプログラムの実行を制御する方法。
  • 構造的パターンマッチングのための Python 3.10 の強力なmatch-caseステートメントを探求しました。
  • whileとforを使用してループを作成し、breakとcontinueを使用してその動作を制御する方法。

これらのスキルを身につけることで、意思決定を行いタスクを繰り返すことができる、より複雑でインテリジェントな Python プログラムを書くことができるようになりました。