プログラムには、入力された値に応じて処理を変える場面があります。
たとえば圧力が許容範囲内なら運転を許可し、上限を超えたら警告を表示する、といった処理です。
pressure_mpa = 14.0
if pressure_mpa <= 16.0:
print("許容範囲内です")
else:
print("上限を超えています")
実行結果です。
許容範囲内です
このように、条件が成立するかどうかで処理を分けることを条件分岐と呼びます。
この記事では、if、elif、elseの基本から、真偽値、境界値、入力検証、条件を並べる順序まで扱います。
今日の到達点
この記事を読み終えると、次のことができるようになります。
if、elif、elseで処理を分岐できる- 比較演算と論理演算を条件に使える
- truthyとfalsyの考え方を説明できる
- 上限値や下限値を含む境界条件を記述できる
- 条件を並べる順序が結果へ与える影響を理解できる
- 未入力、異常値、正常値を区別できる
- 深いネストを避け、判定ルールを読みやすく整理できる
if文の基本
ifは、条件がTrueと判定された場合に、インデントされた処理を実行します。
pressure_mpa = 14.0
if pressure_mpa >= 10.0:
print("圧力は10 MPa以上です")
実行結果です。
圧力は10 MPa以上です
基本構文は次の形です。
if 条件:
条件が成立したときの処理
条件の後ろにはコロン:が必要です。次の行は半角スペース4個を目安にインデントします。
条件が成立しなければ、インデントされた処理は実行されません。
pressure_mpa = 7.0
if pressure_mpa >= 10.0:
print("圧力は10 MPa以上です")
print("判定終了")
実行結果です。
判定終了
elseで成立しなかった場合を扱う
elseを使うと、ifの条件が成立しなかった場合の処理を書けます。
pressure_mpa = 18.0
if pressure_mpa <= 16.0:
print("許容範囲内です")
else:
print("上限を超えています")
実行結果です。
上限を超えています
elseには条件を書きません。ifの条件が偽だった場合に実行されます。
elifで複数の条件を判定する
3種類以上に分ける場合はelifを使います。
pressure_mpa = 14.0
if pressure_mpa > 16.0:
print("上限超過")
elif pressure_mpa >= 14.0:
print("警告範囲")
else:
print("正常範囲")
実行結果です。
警告範囲
elifは「それまでの条件が成立せず、この条件が成立した場合」を表します。
Python公式チュートリアルでは、elifは0個以上記述でき、elseは省略可能と説明されています。Python公式チュートリアル:if文を参照してください。
条件は上から順番に評価され、最初に成立した分岐だけが実行されます。
比較演算子を条件に使う
比較演算子は、比較結果としてTrueまたはFalseを返します。
| 演算子 | 意味 |
|---|---|
== | 等しい |
!= | 等しくない |
< | より小さい |
<= | 以下 |
> | より大きい |
>= | 以上 |
pressure_mpa = 14.0
print(pressure_mpa == 14.0)
print(pressure_mpa < 16.0)
print(pressure_mpa >= 20.0)
実行結果です。
True
True
False
代入には=、等しいかどうかの比較には==を使います。
pressure_mpa = 14.0
is_equal = pressure_mpa == 14.0
範囲を判定する
Pythonでは、複数の比較を連結できます。
pressure_mpa = 14.0
is_in_range = 0.0 <= pressure_mpa <= 16.0
print(is_in_range)
実行結果です。
True
これは次の条件を同時に確認しています。
0.0 <= pressure_mpa
pressure_mpa <= 16.0
比較の連結は、数学の不等式に近い形で範囲を表現できます。Python公式仕様でも、x < y <= zのような比較連結が定義されています。Python言語リファレンス:比較演算を参照してください。
and・or・notで条件を組み合わせる
複数の条件を組み合わせるには、論理演算子を使います。
| 演算子 | 条件が成立する場合 |
|---|---|
and | 両方が真 |
or | 少なくとも片方が真 |
not | 真偽を反転 |
and
センサーが正常で、圧力も許容範囲内の場合だけ運転を許可します。
pressure_mpa = 14.0
is_sensor_ok = True
is_operable = (
is_sensor_ok
and 0.0 <= pressure_mpa <= 16.0
)
print(is_operable)
実行結果です。
True
or
非常停止ボタンが押された場合、または圧力が上限を超えた場合に停止します。
pressure_mpa = 18.0
is_emergency_stop = False
must_stop = (
is_emergency_stop
or pressure_mpa > 16.0
)
print(must_stop)
実行結果です。
True
not
is_sensor_ok = False
if not is_sensor_ok:
print("センサーを確認してください")
実行結果です。
センサーを確認してください
andとorは短絡評価を行います。結果が左側だけで確定した場合、右側は評価されません。また、厳密には常にboolを返すのではなく、評価されたオペランドの一方を返します。Pythonの論理演算に動作が定義されています。
条件式では便利ですが、値の初期化へ使う場合は戻り値の型を意識する必要があります。
truthyとfalsy
Pythonでは、TrueとFalseだけでなく、さまざまなオブジェクトを条件として評価できます。
真として扱われる値をtruthy、偽として扱われる値をfalsyと呼ぶことがあります。
代表的なfalsyの値は次のとおりです。
FalseNone- 数値の
0や0.0 - 空文字列
"" - 空リスト
[] - 空タプル
() - 空辞書
{} - 空集合
set()
values = [
False,
None,
0,
0.0,
"",
[],
{},
set(),
]
for value in values:
print(bool(value))
実行結果です。
False
False
False
False
False
False
False
False
反対に、次の値はtruthyです。
print(bool("0"))
print(bool([0]))
実行結果です。
True
True
文字列"0"は空ではないため真、リスト[0]は要素を1つ持つため真です。中身の値が数値の0であることとは別の判定です。
Python公式ドキュメントでは、None、False、数値の0、空のシーケンスやコレクションなどが偽として扱われると定義されています。Pythonの真理値判定を参照してください。
0と未入力を混同しない
truthyとfalsyを利用すると、空の値を簡潔に検出できます。
part_name = ""
if not part_name:
print("部品名が未入力です")
これは文字列の入力確認には有効です。
しかし、数値では注意が必要です。
pressure_mpa = 0.0
if not pressure_mpa:
print("圧力が未入力です")
実行結果です。
圧力が未入力です
0.0は有効な測定値かもしれませんが、条件式では偽として扱われます。
未測定状態をNoneで表しているなら、次のように明示的に判定します。
pressure_mpa = 0.0
if pressure_mpa is None:
print("圧力が未測定です")
else:
print(f"測定値: {pressure_mpa:.1f} MPa")
実行結果です。
測定値: 0.0 MPa
Noneはis Noneまたはis not Noneで確認します。これにより、「値がない状態」と「値が0の状態」を区別できます。
境界値を明確にする
条件分岐では、境界となる値をどちらの範囲へ含めるか決める必要があります。
次のルールを考えます。
- 0 MPa未満:入力範囲外
- 0 MPa以上14 MPa未満:正常範囲
- 14 MPa以上16 MPa以下:警告範囲
- 16 MPa超:上限超過
pressure_mpa = 16.0
if pressure_mpa < 0.0:
status = "入力範囲外"
elif pressure_mpa > 16.0:
status = "上限超過"
elif pressure_mpa >= 14.0:
status = "警告範囲"
else:
status = "正常範囲"
print(status)
実行結果です。
警告範囲
ここでは16.0 MPaを警告範囲へ含め、16.0 MPaを超えた場合だけ上限超過としています。
境界値の確認結果は次のとおりです。
| 入力値 | 判定 |
|---|---|
-0.1 | 入力範囲外 |
0.0 | 正常範囲 |
13.9 | 正常範囲 |
14.0 | 警告範囲 |
16.0 | 警告範囲 |
16.1 | 上限超過 |
主要な境界値はPython 3.12.14で実行確認済みです。
<と<=、>と>=を感覚で選ばず、境界値そのものをテストしてください。
条件の順序で結果が変わる
ifとelifは上から評価されるため、広い条件を先に置くと、後ろの狭い条件へ到達できないことがあります。
次のコードには問題があります。
pressure_mpa = 18.0
if pressure_mpa >= 14.0:
print("警告範囲")
elif pressure_mpa > 16.0:
print("上限超過")
実行結果です。
警告範囲
18.0はpressure_mpa >= 14.0を満たすため、上限超過の分岐まで進みません。
より厳しい条件を先に置きます。
pressure_mpa = 18.0
if pressure_mpa > 16.0:
print("上限超過")
elif pressure_mpa >= 14.0:
print("警告範囲")
else:
print("正常範囲")
実行結果です。
上限超過
条件が重なり得る場合は、一般に範囲の狭い条件や優先度の高い異常条件から判定します。
入力値を検証してから判定する
Day 3で扱ったinput()は、入力内容を文字列として返します。空文字列や数値へ変換できない文字列を、そのまま計算へ渡してはいけません。
次のコードでは、入力を段階的に検証します。
import math
pressure_text = input("Pressure [MPa]: ").strip()
if pressure_text == "":
print("圧力を入力してください")
else:
try:
pressure_mpa = float(pressure_text)
except ValueError:
print("数値として解釈できません")
else:
if not math.isfinite(pressure_mpa):
print("有限の数値を入力してください")
elif pressure_mpa < 0.0:
print("0 MPa以上を入力してください")
elif pressure_mpa > 16.0:
print("上限超過")
elif pressure_mpa >= 14.0:
print("警告範囲")
else:
print("正常範囲")
入力と結果の対応例です。
| 入力 | 結果 |
|---|---|
| 空文字列 | 圧力を入力してください |
high | 数値として解釈できません |
nan | 有限の数値を入力してください |
-0.1 | 0 MPa以上を入力してください |
13.9 | 正常範囲 |
14.0 | 警告範囲 |
16.1 | 上限超過 |
このコードは、次の順序で入力を処理しています。
- 入力の有無を確認する
- 数値へ変換できるか確認する
- 有限の数値か確認する
- 物理的な入力範囲を確認する
- 運用上の警告・上限を判定する
プログラム上で数値へ変換できることと、工学的に妥当な値であることは別です。
ネストを深くしすぎない
条件の中に条件を重ねることをネストと呼びます。
if is_sensor_ok:
if pressure_mpa >= 0.0:
if pressure_mpa <= 16.0:
print("運転可能")
短い例なら動作を追えますが、条件が増えると右へ深くなり、どの条件に対応する処理か分かりにくくなります。
複数の条件を一つの式へまとめられる場合があります。
is_operable = (
is_sensor_ok
and 0.0 <= pressure_mpa <= 16.0
)
if is_operable:
print("運転可能")
else:
print("運転不可")
ただし、異常の原因ごとにメッセージを変えたい場合は、無理に一つへまとめません。
if not is_sensor_ok:
print("センサー異常")
elif pressure_mpa < 0.0:
print("入力範囲外")
elif pressure_mpa > 16.0:
print("圧力上限超過")
else:
print("運転可能")
条件式の短さより、判定ルールを上から読めることを優先します。
工学的な判定ルールをコードへ落とす
工学計算では、条件式を書く前に判定ルールを文章または表で決めます。
例として、温度による状態判定を考えます。
| 条件 | 状態 |
|---|---|
| 0℃未満 | 入力範囲外 |
| 0℃以上60℃未満 | 正常 |
| 60℃以上80℃以下 | 警告 |
| 80℃超 | 停止 |
コードへ変換します。
oil_temperature_c = 72.0
if oil_temperature_c < 0.0:
status = "入力範囲外"
elif oil_temperature_c > 80.0:
status = "停止"
elif oil_temperature_c >= 60.0:
status = "警告"
else:
status = "正常"
print(status)
実行結果です。
警告
条件式だけを先に書くと、60℃や80℃をどちらへ含めるか曖昧になりやすくなります。
先に判定表を作れば、正常値、境界値、異常値をテストしやすくなります。
よくある失敗
コロンを書き忘れる
if pressure_mpa > 16.0
print("上限超過")
ifの条件末尾にはコロンが必要です。
インデントがそろっていない
if pressure_mpa > 16.0:
print("上限超過")
分岐内の処理はインデントします。
=で比較する
if pressure_mpa = 14.0:
print("警告範囲")
代入は=、比較は==です。
if pressure_mpa == 14.0:
print("警告範囲")
浮動小数点数を安易に完全一致で比較する
計算結果のfloatを==で判定すると、2進表現による誤差の影響を受けることがあります。
import math
result = 0.1 + 0.1 + 0.1
if math.isclose(result, 0.3):
print("許容誤差内で等しい")
許容誤差は用途に応じて設定します。表示上同じ値に見えることと、内部値が完全一致することは同じではありません。
0を未入力として扱う
if not measured_pressure_mpa:
print("未測定")
この条件では、Noneと0.0を区別できません。
if measured_pressure_mpa is None:
print("未測定")
状態を明確に分けて判定します。
練習問題
圧力を3段階で判定する
圧力について、次のルールで判定してください。
- 10 MPa未満:低圧
- 10 MPa以上16 MPa以下:使用範囲
- 16 MPa超:上限超過
解答例です。
pressure_mpa = 12.0
if pressure_mpa > 16.0:
status = "上限超過"
elif pressure_mpa >= 10.0:
status = "使用範囲"
else:
status = "低圧"
print(status)
実行結果です。
使用範囲
確認する境界値は9.9、10.0、16.0、16.1です。
必須項目を確認する
部品名が空文字列なら入力を促し、値があれば部品名を表示してください。
解答例です。
part_name = "Cylinder A"
if part_name:
print(f"Part: {part_name}")
else:
print("部品名を入力してください")
実行結果です。
Part: Cylinder A
複数条件で運転可否を判定する
センサーが正常で、圧力が0 MPa以上16 MPa以下の場合だけTrueになる条件を作ってください。
解答例です。
is_sensor_ok = True
pressure_mpa = 14.0
can_operate = (
is_sensor_ok
and 0.0 <= pressure_mpa <= 16.0
)
print(can_operate)
実行結果です。
True
まとめ
Pythonでは、条件式の真偽によって処理を分岐できます。
ifは条件が成立した場合に実行するelifは前の条件が成立しなかった場合に次の条件を確認するelseはどの条件も成立しなかった場合に実行する- 条件は上から順番に評価される
- 比較演算子は
TrueまたはFalseを返す and、or、notで条件を組み合わせられるNone、数値0、空文字列、空コレクションなどはfalsyになる- 数値0と未入力を区別する
- 境界値をどちらの範囲へ含めるか明確にする
- 重なり得る条件では、優先度の高い条件を先に置く
- 入力の有無、型、有限性、物理範囲、運用範囲を段階的に検証する
- 深すぎるネストを避け、判定ルールを上から読める形にする
条件分岐は、単に処理を分ける構文ではありません。設計基準や検査ルールを、再実行可能な判断手順へ変換するための基本です。

