Python入門 - if文(if / elif / else); 条件分岐をする方法について

作成日:

本ページではPythonの入門コンテンツとして初学者向けにPythonにおいて if文 を利用して条件分岐を行う方法について説明します。

要約#

  • 条件分岐のために以下の命令が用意されている

    • if : 条件式がTrueならば実行

    • elif : if で漏れた条件について if と同じことを実施

    • else : すべての条件から漏れたものについて処理を実施

if文について#

ここからやっとプログラムの論理部分を記述する方法について解説していきます。

本ページでは変数の状態や関数の戻り値に応じて処理の流れを変更する if / elif / else の利用方法について解説します。

条件が True であれば処理を行う if#

if は 英語のifそのもので、「もし~~であれば」という意味を表す単語です。Pythonでは if の後に条件文を記述し、その内容が True である際に指定した処理を行う、というように処理の流れを変更するために利用されます。

最初に具体例#

具体的な例を示します。

variable = 100
if variable % 25 == 0:
    print('条件式がTrueでした')
    print('variable が 25 で割り切れる値です')

上記の例は variable という変数が 25 で割り切れる場合に print() 文の処理を行うような if 文になります。

if 文の構造#

if 文の構造を解説すると、以下のような形になります。

if <条件式>:
    <条件式が True の際に実施する命令>
    ...

<条件文> の個所には何かしらの値を返すPythonの 式(expression)[1] を記述する必要があります。具体的には以下のようなものが入ります。

  • 比較演算子、例えば a == b , a < b など

  • 関数の呼び出し、例えば文字列に対する isdigit() , isspace() など

条件式の後にはコロン : を置く必要があります。

コロンの後には、条件式がTrueの際に実施する内容を記述していくわけですが、 この個所はインデントをつける必要があります。 これはPythonの特徴で、PythonではC言語やJavaなどで見られるような波カッコの代わりに、インデントによりコードを解釈していきます。

インデントとは、単に空白のことなので適当に半角スペースを入れてもらえればよいのですが、Pythonの推奨するインデントは PEP8 にて「半角スペース4つ」とされています。

補足: インデントの仕組みについてもう少し#

本ページで解説している if のみならず、今後出てくる関数の宣言 def や クラスの宣言 class などでも同様のインデントによるルールが存在します。インデントがついている個所は if などに関係する記述部分であり、インデントが終わった個所で元の処理に戻る、というようにインデントの有り無しによってコードの解釈を変えているわけです。

この仕組みはC言語などでカッコによって実現されていましたが、それよりもインデントによって実現した方がコードが見やすくなる(カッコが減って視認性が良くなる、インデントが強制されるのでコードの位置が揃うようになる)という理念のもと導入されていったものです。

Pythonはこの機能ためにインデントの存在が文法に組み込まれており、適当な位置にインデントをつけると文法違反でエラーとなります。 例えば、インタラクティブモード上で以下をコピーして実行するとエラーになります。

# わかりづらいですが、先頭にスペースが入っています。
 print('エラーになるよ')

以下のエラーが出力されます。

IndentationError: unexpected indent

IndentationError、ということでインデントのエラーです。 "unexpected indent" つまり予期しないインデントがあったのでエラーとなっています。

本インデント関連の用語として、 if 文などのコロンを付与する必要がある文とインデントが付与されている箇所をまとめて節 (clause) と呼ばれます。

if a == 0:              #  <--+
    print('Test')       #     |  この全体を clause と呼ぶ
    print('if')         #     |
    print('clause')     #  <--+

節の中ではインデントの高さはすべて同一である必要があり、変更することができません。

また、節の中に節を入れることも可能でこの場合は更にインデントがついたような形になります。

if a == 0:
    print('1段階目の節')
    if b == 0:
        print('2段階目の節')
    print('1段階目の節')
print('節の外')

elif文について#

elif 文は if 文をつなげるための仕組みです。最初に記述した if 文では True と判定されなかった場合に第2、第3の条件を記述するために利用されます。

ちなみに、 elif は "else if" (そうでなければ もし) という英語の略です。

具体例#

例えば、以下では variable の値が 16で割り切れる10より小さい それぞれの場合について条件分岐するコードになっています。

variable = 6
if variable == 1:
    print('variableは1です')
elif variable % 6 == 0:
    print('variableは6で割り切れます')
elif variable < 10:
    print('variableは10より小さいです')

このように ifelif を利用することで条件分岐をつなげることができます。

上の例は次の if のみを利用した例とは処理内容が異なることに注意してください。

variable = 6
if variable == 1:
    print('variableは1です')

if variable % 6 == 0:
    print('variableは6で割り切れます')

if variable < 10:
    print('variableは10より小さいです')

ifelif の連結では、いずれかの条件文がTrueになると、その処理を実行して ifelif のチェーンから抜け出していきますが、単に if を並べた場合にはそれぞれの条件を個別に判定してくことになります。

else文について#

else 文は if および elif 文でのすべての条件式が False となった場合に処理を行う節を記述するものです。どの条件に当てはまらない場合に行いたい処理を記述する形になります。

具体例#

例えば、以下では variable の値が 16で割り切れる10より小さい そして そのいずれでもない というそれぞれの場合について条件分岐するコードになっています。

variable = 13
if variable == 1:
    print('variableは1です')
elif variable % 6 == 0:
    print('variableは6で割り切れます')
elif variable < 10:
    print('variableは10より小さいです')
else:
    print('どれにも当てはまりませんでした')

このように ifelif で漏れた条件について対応することができます。

if - elif - else 全体の構造#

if 文の構造 の個所で説明していた構造を elifelse も含めたもので書き直してみましょう。

if <条件式>:
    <条件式が True の際に実施する命令>
    ...
elif <条件式>:
    <条件式が True の際に実施する命令>
    ...
else:
    <これまでのすべての条件式に当てはまらなかった際に実施する命令>
    ...

もう少し具体例#

さて、ここまででいくつか具体例を挙げていますがあまり実用的なものではありませんでした。ここではいくつか実際に利用できるようなものを挙げてみます。

list の中にデータがあるかをチェック#

sample_list = [1, 2, 3, 4, 5]
target = 1
if target in sample_list:
    print(f'{target} is contained in simple_list')

ここでは in 演算子を利用しています。 in 演算子は主に listdict に対して利用できる演算子で、所望の値やキーが listdict に含まれているかをチェックし含まれている場合 True 、そうでない場合 False を返すものです。

target in simple_list
# => True

これを利用することで、特定の list あるいは dict の中に探しているものがあるかをチェックすることができます。

dict の中にデータがあるかをチェック#

先ほど説明した dict の中に所望のキーが含まれているかを調べる方法です。

sample_dict = {
    'John': 'Guitar',
    'Paul': 'Bass',
}
target = 'John'
if target in sample_dict:
    print(f'{target} is contained in simple_dict')

str の中にデータがあるかをチェック#

更に、実はこの instr に対しても適用することができます。

sample_str = 'これはテスト文字列です'
target = '文字列'
if target in sample_str:
    print(f'{target} is contained in simple_str')

文字列の検索が簡単に実施できるのは非常に便利です。

入力されたデータが数値のみで構成されているかチェック#

少し前に input() によるユーザからのデータ入力を取り扱ました。その時に数値以外が含まれていると int() などによる変換時にエラーが生じる、という話題を上げましたがこれを回避する方法です。

input_data = input('Input a number: ')
if input_data.isdigit():
    int_data = int(input_data)
    print(f'Your input was successfully converted into {int_data}')
else:
    print(f'Your input contains non-digit character: {input_data}')

ここでは条件式に isdigit() という関数を利用しています。この関数は文字列が数字に変換可能な文字のみを含んでいると True を応答してくれる関数です。

このようにPythonは実は色々便利な関数を用意してくれています。もし気が向いたら Python公式のライブラリマニュアル を見てみると新たな発見があるかもしれません。

まとめ#

本ページでは ifelif および else を利用した条件分岐について解説しました。条件分岐が入ってくるとプログラムを書いているという感じがしてきますね。

条件分岐はプログラムの論理(logic)を記述する非常に重要な部分です。ぜひ条件分岐を使いこなして高度なプログラムを書いていきましょう。

Python