テクノロジー

2023年1月1日

Python入門5 条件分岐

条件分岐が扱えるようになる

条件分岐

条件分岐を使うことでコンピュータに判断をさせることができるようになります。

条件分岐の書き方

条件分岐は if文 によって書きます。if文ではifやelseを使いますが、これはPythonの予約語です。

以下は条件分岐の例で、与えられた年齢の値が20未満かどうかを判定するプログラムです。student_age<20は変数student_ageが20未満かどうかを判定する 条件式 です。条件式の後には:を入れる必要もあります。また、print関数が右にずれていますが、これは インデント と呼ばれるもので、Pythonでは重要な意味を持ちます。

student_name = "Alice"
student_age = 19
if student_age < 20:
  print("{}は20歳未満です。".format(student_name))
else:
  print("{}は20歳以上です。".format(student_name))

実行すると「Aliceは20歳未満です。」と表示されます。student_ageは整数型の19であり、20よりも小さいという条件を満たしています。

student_ageを20以上の値に変更してみます。

student_name = "Alice"
student_age = 22
if student_age < 20:
  print("{}は20歳未満です。".format(student_name))
else:
  print("{}は20歳以上です。".format(student_name))

実行すると「Aliceは20歳以上です。」と表示されます。student_ageは整数型の22であり、20よりも小さいという条件を満たしていません。

ifに続けて書かれた条件式を満たしている場合は直後のコードが実行されます。一方、条件式を満たしていない場合はelseの後のコードが実行されます。

なお、条件を満たさなかった場合の部分は省略することができます。

student_name = "Alice"
student_age = 22
if student_age < 20:
  print("{}は20歳未満です。".format(student_name))

実行しても条件を満たしていないのでprint関数は呼ばれず、何も表示されません。

elifを使うことで条件式を増やしていくこともできます。student_age == 21student_age == 22は変数student_ageが21、または22であるかを判定する条件式です。

student_name = "Alice"
student_age = 22
if student_age < 20:
  print("{}は20歳未満です。".format(student_name))
elif student_age == 21:
  print("{}は21歳です。".format(student_name))
elif student_age == 22:
  print("{}は22歳です。".format(student_name))
else:
  print("{}は23歳以上です。".format(student_name))

実行すると「Aliceは22歳です。」と表示されます。

《条件が判定される順番》

elifを使った場合は、上から順番に判定されていき、条件を満たした時点でその後ろの判定は行われなくなります。以下の例では、変数student_ageが21より大きいかを判定するstudent_age >= 21を2つ目に入れたため、student_age == 22が絶対に判定されないプログラムになってしまっています。

student_name = "Alice"
student_age = 22
if student_age < 20:
  print("{}は20歳未満です。".format(student_name))
elif student_age >= 21:
  print("{}は21歳以上です。".format(student_name))
elif student_age == 22:
  print("{}は22歳です。".format(student_name))

プログラムは上から順番に実行されるという法則が前提としてあり、さらにif文では条件をひとつでも満たしたら以降は判定されないということを覚えておきましょう。

条件式

if文の中で使われる条件式について見ていきます。条件式は<>===といった 比較演算子 によって作られます。また、条件式と合わせて覚えたいのが ブール型(bool) です。以下は『「19は20未満か」「22は20未満か」の判定結果と、そのデータ型を表示させる』というプログラムです。

print(19 < 20)
print(type(19 < 20))
print(22 < 20)
print(type(22 < 20))

実行すると「True」「<class ‘bool’>」「False」「<class ‘bool’>」と表示されます。条件式はその条件を満たしていれば True(真) 、満たしていなければ False(偽) というブール型の値を返します。

ブール型は真偽を表すためのTrueとFalseの2種類のみの値が存在するデータ型です。TrueとFalseはPythonの予約語になっています。

条件式はブール型になるということは、ifの後に直接ブール型を書くこともできるということです。

if True:
  print("Hello, Boolean!")

比較演算子

比較演算子は<><=>===!=といったものが存在します。それぞれ「小なり」「大なり」「以下」「以上」「等しい」「等しくない」を意味します。なお、比較演算子の両側には必ずスペースをひとつずつ入れる書き方が推奨されています。

整数型と浮動小数点型は直接比較することができます。

print(20 > 19.5)

==!=は数値だけでなく、文字列などに使うこともできます。

print("Python" == "Python")

ブール演算子

ブール型に使える演算子としてandornotがあります。それぞれ「論理積(かつ)」「論理和(または)」「否定(でない)」を意味します。

andは例えば以下のように使います。student_age>=10student_age<20の両方を満たしているかどうかを判定しています。

student_name = "Alice"
student_age = 19
if (student_age >= 10) and (student_age < 20):
  print("{}は10代です。".format(student_name))

ブール演算子を使った(student_age >= 10) and (student_age < 20)もブール型で、この例ではTrueになります。

orは以下のように、どちらかを満たしているかどうかを判定します。

student_name = "Alice"
student_age = 21
if (student_age == 15) or (student_age >= 20):
  print("{}は15歳または20歳以上です。".format(student_name))

notは次のような使われ方をすることが多いです。「年齢を判定しない」ことを示すブール型変数no_judgementを用意しておき、『「年齢を判定しない」がTrueではない時は年齢を判定する』というプログラムです。notを使わないこともできますが、この方が意味がとりやすいという場合にこういった書き方をすることがあります。

no_judgement = False
student_name = "Alice"
student_age = 19

if not(no_judgement):
  if student_age < 20:
    print("{}は20歳未満です。".format(student_name))
  else:
    print("{}は20歳以上です。".format(student_name))
else:
  print("年齢の判定はしません。")

なお、ここでの()は条件式を見やすくするためのもので、取り除くこともできます。括弧を使わずともブール演算子は比較演算子よりも優先順位が低く、次の2つは同じ意味です。

print((student_age >= 10) and (student_age < 20))
print(student_age >= 10 and student_age < 20)

インデント

if文の中ではコードが右にずれている インデント が使われています。これは、条件を満たした場合に実行する範囲や、満たさなかった場合に実行する範囲を示すためのものです。ひとかたまりの範囲を インデントブロック と呼びます。他の言語ではこの範囲を括弧などにより示し、インデントは処理には影響しないという例が多いですが、Pythonではインデントが強い意味を持ちます。

そのため、もしこのインデントを忘れてしまうとエラーとなります。

*以下はエラーになる例です。

student_name = "Alice"
student_age = 22
if student_age < 20:
print("{}は20歳未満です。".format(student_name))
else:
print("{}は20歳以上です。".format(student_name))

実行すると4行目に対して「IndentationError: expected an indented block」というエラーメッセージが表示されます。「そこにはインデントブロックがあるべきだ」ということを示しています。

《インデントはどのように入れる?》

インデントは好きな数の半角スペースを入れることで行いますが、PEP8において「半角スペース4個」が推奨されています。

インデント — pep8-ja 1.0 ドキュメント

ただし、Colabでは「半角スペース2個」が設定されており、インデントが必要な場所では改行をすると自動的に半角スペース2個が入力されます。ディープロのPython入門ではこのColabに合わせたサンプルコードを載せています。

なお、タブを使うこともできますが、これは推奨されていません。ですが、ColabではTabキーを押すことで、タブではなく半角スペース2個が入力されるようになっています。そのためTabキーを使いインデントを行うことが可能です。

扱いやすいプログラム

上の例では20という数値をif文の中に直接書いていました。しかし、これではなぜ20という値で判断しているのかが分かりません。これでは本人以外に扱いにくいプログラムになってしまいます。

20歳が例えば成人年齢を表しているのだとしたら、それが分かるような名前の変数(定数)を使うべきです。成人年齢はプログラムの中で変わることはないので、定数として大文字のアルファベットの名前にします。

ADULT_AGE = 20

student_name = "Alice"
student_age = 19
if student_age < ADULT_AGE:
    print("{}は{}歳未満です。".format(student_name, ADULT_AGE))
else:
    print("{}は{}歳以上です。".format(student_name, ADULT_AGE))

このようにしておくと意味が分かりやすいプログラムになります。さらに、もし成人年齢の定義が20歳から18歳に変更になった時に、最初の1行だけの修正で対応できます。複数箇所を検索機能や置換機能を使い修正しようとすると、別の意味でも20が使われている場合に面倒なことになってしまいます。

成人年齢は一見不変の値ですが、時代や地域によって変わるものです。変更に対応しやすいプログラムを意識するようにしましょう。

.参考文献

6.10. 比較 — Python 3.7.3 ドキュメント

ダイビックのことをもっと知ってみませんか?