Python速習ガイド - ステップ2 制御フロー (1) - 条件分岐 (1)
- 本講座は、Pythonプログラミングの基礎を手を動かしながら最速で身につけるための講座です。
- 「スタイルガイド」では、Pythonできれいなコードを書くためのガイドライン(PEP8)で紹介されている内容を主に記載しています。
- 各コードは実行して結果を確認することができます。
ページの再読み込みで元の内容に戻りますので、自由にいじってみてください。
前回までは「ステップ1 基本的な文法とデータ型」としてデータ型やその操作について学びました。
今回からは「ステップ2 制御フロー」として、プログラムの流れをコントロールする方法について学んでいきます。
ステップ2 制御フロー
プログラムは通常、上から下へ順番に実行されます。
しかし実際のアプリケーションでは、特定の条件が満たされたときだけ実行したい処理や、繰り返し実行したい処理があります。
こうした「プログラムの流れ」をコントロールする仕組みのことを制御フローと呼びます。
2.1. 条件分岐
条件分岐は、特定の条件が満たされた場合にのみ、特定の処理を実行するための制御フローです。
2.1.1. if
文
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ではインデントが同じレベルのコードがひとつのブロックとして扱われます。
これによりコードの見た目が整い、読みやすくなりますが、インデントのミスがエラーの原因になることもあります。
2.1.2. if-else
文
else
句を使うと、条件が満たされなかった場合に実行する処理を指定できます。
- 条件式が
True
の場合はif
ブロックが実行され、False
の場合はelse
ブロックが実行されます if
かelse
のどちらかが必ず実行されます
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度以上なら「暑いです」、
そうでなければ「涼しいです」と出力するプログラムを作成しましょう。
解答例
2.1.3. if-elif-else
文
複数の条件を順番にチェックしたい場合は、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度以上)」
解答例
2.1.4. 入れ子の条件分岐
条件分岐の中に別の条件分岐を入れ子(ネスト)にすることができます。
- 内側の条件分岐は、外側の条件が
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%追加割引
以下のコードをよりフラットなコードに書き換えましょう。
(価格について、小数点以下は切り捨てとします)