Pythonインタラクティブガイド - ステップ2 制御フロー (1) - 条件分岐 (1): if文
- 本講座「Pythonインタラクティブガイド」は、手を動かしながら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%追加割引
以下のコードをよりフラットなコードに書き換えましょう。
(価格について、小数点以下は切り捨てとします)