見出し画像

Pythonの基本③ 条件分岐(if文)


if文の基本

プログラミングでよく使用する条件分岐の書き方についてまとめました。
ifの後に条件式を記述し、それが真(true)だった場合に実行される処理を続けて記述します。最初の条件が偽(false)だった場合、elifでさらに条件を設定しその条件がtrueだった場合の処理を記述したり、elseで条件がfalseだった場合の処理を記述することが出来ます。
最初の条件がfalseの場合、特に何も実行しなければelifやelseは省略できます。

if文の構文

条件式の書き方

等号・不等号

Pythonでは「=」は代入を意味し、「等しい」という意味ではありません。
等号は「==」で表現します。不等号は<、<=、>、>=が使用できます。

a = 5    # このイコールは変数への代入を意味する
if a <= 4:
  print('真です。')
else:
  print('偽です。')

上記を実行すると、
> 偽です。
と表示されます。「aは4以下」という条件式はfalseなので、else以下のコードが実行された結果です。

if not a <= 4:
  print('真です')
else:
  print('偽です')

上記のように、if not とすることも出来ます。実行すると、
> 真です。
と表示されます。「aは4以下ではない」という条件式はtrueなので、最初の処理が実行されました。notを付けることで、結果が反転します。

リスト

リストに含まれるかどうかも判定することができます。

fruit = ['りんご', 'みかん', 'なし', 'ぶどう', 'バナナ', 'パイナップル']
vegetable = ['トマト', 'きゅうり', 'なす', 'かぼちゃ', 'はくさい', '玉ねぎ']

a = input()
if a in fruit:
  print('果物です。')
elif a in vegetable:
  print('野菜です。')
else:
  print('分類できません。')

fruitとvegetableのリストを最初に定義しました。
input()で任意の単語(や文章)を入力でき、入力した単語はaという変数へ文字列として代入されます。もし、入力した単語がfruitリストにあれば、「果物です。」と表示されます。同様にvegetableリストにあれば、「野菜です。」と表示されるはずです。どちらのリストにも無ければelseの処理が実行されます。

複数条件

条件式にはandorを用いることもできます。
※input()は文字列を返すので、数字の大小を判定する時は、整数(int型)もしくは小数(folat型)にデータ型を変更する必要があります。

age = int(input('年齢:'))
height = float(input('身長(cm):'))

if age >= 5 and height >= 100:
  print('単独で乗車可能')
elif age >= 5 or height >= 100:
  print('保護者の同伴があれば乗車可能')
else:
  print('乗車不可')

①年齢5歳以上かつ身長100cm以上 →単独で乗車可能
②(①が偽で)年齢5歳以上もしくは身長100cm以上(どちらか一方を満たす)
 →保護者の同伴があれば乗車可能
③どちらも満たさない →乗車不可
というように、andを使用すれば2条件をどちらも満たす場合にtrueとなり、orを使用するとどちらかを満たしていればtrueとなります。

注)プログラムは上から下に向かって実行されていくので、以下のように①と②の条件式を入れ替えると、本来and条件の処理を行うべき組み合わせでもor条件で処理されてしまうので注意しましょう。

if age >= 5 or height >= 100:
  print('保護者の同伴が必要')
elif age >= 5 and height >= 100:
  print('単独で乗車可能')
else:
  print('乗車不可')

メタボ判定の条件分岐を作ってみよう

以上を踏まえて、メタボ判定プログラムを書いてみましょう。

メタボリックシンドロームの診断基準

ウエスト周囲径(男女で異なる)の基準と高脂血、高血圧、高血糖の3つのうち2項目以上を満たすとメタボのようです。
右側の3項の条件がいくつ当てはまるか?を上手く表現できれば解決できそうです。
例えば、空のリストを準備しておいて3項の判定結果を○×でリストに格納し(append()を使用します)、リスト中の×の数が2以上かどうかを判定すれば良いことになります。

gender = input('性別 m or f:')
waist = int(input('ウエスト(cm):'))
tg = int(input('トリグリセリド(mg/dL):'))
hdl = int(input('HDL(mg/dL):'))
sbp = int(input('収縮期血圧(mmHg):'))
dbp = int(input('拡張期血圧(mmHg):'))
glc = int(input('空腹時血糖(mg/dL):'))

judge = []  # 判定用の空リスト
# 高脂血の判定
if tg >= 150 or hdl < 40:
  judge.append('×')
else:
  judge.append('○')
# 高血圧の判定
if sbp >= 130 or dbp >= 85:
  judge.append('×')
else:
  judge.append('○')
# 高血糖の判定
if glc >= 110:
  judge.append('×')
else:
  judge.append('○')

上記を実行すると、入力した数字に応じてjudgeというリストに['〇', '×', '×']というように○×が格納されます。
リスト.count('×')で引数(この場合は×)の要素数を調べることが出来ます。
あとは、ウエスト周囲径(男女で異なる)との条件で分岐させ判定コメントを出力するように記述します。

if gender == 'm':
  if waist >= 85 and judge.count('×') >=2:
    comment = 'メタボです。生活習慣を改めましょう。'
  else:
    comment = 'メタボではありません。'
elif gender == 'f':
  if waist >= 90 and judge.count('×') >=2:
    comment = 'メタボです。生活習慣を改めましょう。'
  else:
    comment = 'メタボではありません。'

print(f'あなたは、{comment}')

if文の中にさらにif文を入れることもできます。


条件が複数あって、しかもそのうち〇個に該当する場合…となると判断に時間がかかります。また、複雑になればなるほど間違えるリスクも高まります。
上記のメタボの例でも、1,000件もの健診結果をひとつひとつ判定するのは大変ですが、for文と今回のif文を組み合わせれば正確に大量のデータを処理することが可能です。
上記のコードがスマートかと言われるとそうではない気もしますが、人力でやるよりは早くて正確ですよね。多少実行速度が遅くても、処理に間違いが無い、わかりやすい(メンテナンスしやすい)コードを良しとしています。


薬剤師をやっていると、薬の投与基準や減量基準など実務でも条件分岐が出てきます。判断ミスは健康被害にも繋がるため、避けなければなりません。すべてを機械に頼るわけにはいきませんが、取り入れられるなら活用していくべきだと思います。

この記事が気に入ったらサポートをしてみませんか?