コンテンツ

Python速習ガイド - ステップ2 制御フロー (1) - 条件分岐 (1)

Info
  • 本講座は、Pythonプログラミングの基礎を手を動かしながら最速で身につけるための講座です。
  • 「スタイルガイド」では、Pythonできれいなコードを書くためのガイドライン(PEP8)で紹介されている内容を主に記載しています。
  • 各コードは実行して結果を確認することができます。
    ページの再読み込みで元の内容に戻りますので、自由にいじってみてください。

前回までは「ステップ1 基本的な文法とデータ型」としてデータ型やその操作について学びました。
今回からは「ステップ2 制御フロー」として、プログラムの流れをコントロールする方法について学んでいきます。

プログラムは通常、上から下へ順番に実行されます。
しかし実際のアプリケーションでは、特定の条件が満たされたときだけ実行したい処理や、繰り返し実行したい処理があります。
こうした「プログラムの流れ」をコントロールする仕組みのことを制御フローと呼びます。

条件分岐は、特定の条件が満たされた場合にのみ、特定の処理を実行するための制御フローです。

if文は、指定した条件がTrueの場合にのみ、ブロック内の処理を実行します。

  • 条件式 (上記のage >= 18) がTrueと評価された場合のみ、
    インデント(字下げ)されたブロック (上記のprint("成人です")) が実行されます
  • 条件式がFalseと評価された場合は、そのブロックはスキップされます
flowchart TD
    START[開始] --> IF{"if age >= 18"}

    %% IFからの矢印
    IF -->|False| NEXT[次の処理へ]
    IF -->|True| IF_BLK["ifブロック処理\n(print('成人です'))"]

    IF_BLK --> NEXT
    
    linkStyle 1 stroke:red,stroke-width:2px;
    linkStyle 2 stroke:green,stroke-width:2px;
スタイルガイド
  • コロン(:)の直後には改行を入れましょう
  • インデント(字下げ)は半角スペース4つが標準です
  • 条件式の比較演算子(<, <=など)の前後にはスペースを入れましょう
コラム:Pythonのインデント

Pythonでは、インデント(字下げ)がコードの構造を決める重要な要素です。

他の多くのプログラミング言語では波括弧{}などでブロックを表現しますが、
Pythonではインデントが同じレベルのコードがひとつのブロックとして扱われます。

これによりコードの見た目が整い、読みやすくなりますが、インデントのミスがエラーの原因になることもあります。

else句を使うと、条件が満たされなかった場合に実行する処理を指定できます。

  • 条件式がTrueの場合はifブロックが実行され、Falseの場合はelseブロックが実行されます
  • ifelseのどちらかが必ず実行されます
flowchart TD
    START[開始] --> IF{"if age >= 18"}

    %% IFからの矢印
    IF -->|False| ELSE{"else"}
    IF -->|True| IF_BLK["ifブロック処理\n(print('成人です'))"]

    %% ELSEからの矢印
    ELSE --> ELSE_BLK["elseブロック処理\n(print('未成年です'))"]


    ELSE_BLK --> NEXT[次の処理へ]
    IF_BLK --> NEXT
    
    linkStyle 1 stroke:red,stroke-width:2px;
    linkStyle 2 stroke:green,stroke-width:2px;
    linkStyle 3 stroke:green,stroke-width:2px;
📚練習問題

変数temperatureに気温を設定し、25度以上なら「暑いです」、
そうでなければ「涼しいです」と出力するプログラムを作成しましょう。

解答例

複数の条件を順番にチェックしたい場合は、elif(else ifの略)を使用します。

  • 条件は上から順に評価され、最初にTrueとなった条件のブロックだけが実行されます
  • 複数の条件がTrueになっても、最初のTrueの条件だけが採用されます
  • すべての条件がFalseの場合のみ、elseブロックが実行されます
  • else句はなくても構いません(その場合、すべての条件がFalseなら何も実行されません)
flowchart TD
    START[開始] --> IF{"if <条件>"}

    %% IFからの矢印
    IF -->|False| ELIF{"elif <条件>"}
    IF -->|True| IF_BLK["ifブロック処理"]
  
    %% ELIFからの矢印
    ELIF -->|False| ELIF2{"elif <条件2>"}
    ELIF -->|True| ELIF_BLK["elifブロック処理"]

    %% ELIF2からの矢印
    ELIF2 -->|False| ELSE{else}
    ELIF2 -->|True| ELIF2_BLK["elifブロック(2)処理"]

    %% ELSEからの矢印
    ELSE --> ELSE_BLK["elseブロック処理"]

    %% 「次の処理へ」への矢印
    ELSE_BLK --> NEXT[次の処理へ]
    ELIF2_BLK --> NEXT
    ELIF_BLK --> NEXT
    IF_BLK --> NEXT

    %% 矢印の色指定
    linkStyle 1 stroke:red,stroke-width:2px
    linkStyle 2 stroke:green,stroke-width:2px
    linkStyle 3 stroke:red,stroke-width:2px
    linkStyle 4 stroke:green,stroke-width:2px
    linkStyle 5 stroke:red,stroke-width:2px
    linkStyle 6 stroke:green,stroke-width:2px
    linkStyle 7 stroke:green,stroke-width:2px
条件の順序

elifを使う場合、条件の順序が重要です。
より限定的な条件を後に書くと、その条件は無視されてしまいます。

📚練習問題

BMI値とは、体重(kg)を身長(m)の2乗で割った値を表す数値です。
BMI値に基づいてBMIカテゴリを判定するプログラムを作成しましょう。

変数bmiにBMI値を設定し、以下の条件でBMIカテゴリを出力してください。

  • 18.5未満:「低体重」
  • 18.5以上25未満:「普通体重」
  • 25以上30未満:「肥満(1度)」
  • 30以上:「肥満(2度以上)」
解答例

条件分岐の中に別の条件分岐を入れ子(ネスト)にすることができます。

  • 内側の条件分岐は、外側の条件がTrueの場合のみ評価されます
  • 各レベルのインデントが正しく設定されていることが重要です
flowchart TD
    START[開始] --> IF{"if age >= 18"}
    
    %% 外側のif文
    IF -->|False| ELSE{"else"}
    IF -->|True| IF_BLK["ifブロック処理\n(print('成人です'))"]

    ELSE --> ELSE_OUTER["elseブロック処理\n(print('未成年は入場できません'))"]
    
    %% 内側のif文
    IF_BLK --> INNER_IF{"if has_id"}
    INNER_IF -->|False| ELSE_INNER{"else"}
    INNER_IF -->|True| INNER_TRUE["内部ifブロック処理\n(print('IDを確認しました。入場できます'))"]

    ELSE_INNER --> INNER_FALSE["内部elseブロック処理\n(print('IDがありません。入場できません'))"]
    
    %% 次の処理へ
    ELSE_OUTER --> NEXT[次の処理へ]
    INNER_FALSE --> NEXT
    INNER_TRUE --> NEXT
    
    %% 矢印の色指定
    linkStyle 1 stroke:red,stroke-width:2px
    linkStyle 2 stroke:green,stroke-width:2px
    linkStyle 3 stroke:green,stroke-width:2px
    linkStyle 5 stroke:red,stroke-width:2px
    linkStyle 6 stroke:green,stroke-width:2px
    linkStyle 7 stroke:green,stroke-width:2px
入れ子の深さに注意
入れ子が深くなると、コードの可読性が下がります
できる限りフラットなコードを心がけましょう (PEP20 (The Zen of Python))
📚練習問題:条件分岐の簡素化

あるカフェの割引システムを実装することになりました。以下の条件があります:

  • メンバーは常に10%割引
  • 1,000円以上の注文で5%追加割引

以下のコードをよりフラットなコードに書き換えましょう。
(価格について、小数点以下は切り捨てとします)

解答例

関連記事