連載
» 2020年09月25日 05時00分 公開

解決!Python:[解決!Python]if文で条件分岐を行うには

if文の構文と、比較演算子や論理演算子を使用して条件分岐を行う典型的なコード例を紹介する。

[かわさきしんじ,Deep Insider編集部]
「解決!Python」のインデックス

連載目次

# 変数の値が特定の値かどうか条件とする
num = 1
if num == 0:
    print('value of num is 0')
elif num == 1# elif節は省略可能
    print('value of num is 1')
else# else節は省略可能
    print('value of num is not 0, nor 1')

# リストに特定の要素が含まれているか(いないか)どうかを条件とする
maker_names = ['toyota', 'nissan', 'honda', 'suzuki', 'daihatsu']
maker_name = 'tyrrell'

if maker_name in maker_names:
    print(f'{maker_name} is a japanese car maker')
else:
    print(f'{maker_name} is not a japanese car maker')

# リストが空かどうかを条件とする
some_list = []

if some_list:
    print('list has some item(s)')
else:
    print('list has nothing')

# 2つのオブジェクトが同一であるかどうかを条件とする
s1 = 'deep insider'  # 2つの変数s1とs2は同じオブジェクトを参照する
s2 = s1

if s2 is s1:  # 変数s2とs1が参照するオブジェクトは同一
    print('two objects are identical')


if文

 if文は「もし○○なら××をして、そうでなければ□□をする」といった、プログラム内部で保持している何らかの情報の値を基に、処理を分岐するために使われる。以下にその構文を示す。なお、詳細については「Python入門」の「if文による条件分岐」などを参照されたい。

if <条件0>:
    <条件0>が成立したときに行う処理
elif <条件1>:
    <条件1>が成立したときに行う処理
else:
    全ての<条件>が成立しなかったときに行う処理


 elif節とelse節は省略可能で、elif節は何個でも書ける。if節とelif節だけで構成され、else節がないif文も許される。elif節とelse節がなければ、一番シンプルな次のようなif文となる

num = 100

if num == 99:
    print('value of num is 99')


 このようにif文ではif節、elif節、else節を組み合わせることで、条件に応じて処理を幾つにも分岐させられる。この条件としては、さまざまな式を記述する。この式の値がTrueなら「その条件が成立した」としてそのブロックのコードが実行される。Falseなら「その条件が成立しなかった」として、次の処理(if文の次の節、または次の文)に処理が移る。

変数や計算式の値が特定の値かどうかを条件とする

 変数(オブジェクト)や計算式の値が特定の値かどうかを基に処理を分岐するには、以下の演算子を使用する。

演算子 説明
x == y xとyの値が等しいかどうか
x != y xとyの値が等しくないかどうか
x > y xの値がyの値より大きいかどうか
x >= y xの値がyの値以上かどうか
x < y xの値がyの値よりも小さいかどうか
x <= y xの値がyの値以下かどうか
比較演算子

 以下に例を示す。

# 数値(整数値)の大小比較
from random import randint
num = randint(1, 20# 1〜20の範囲の整数値

if num > 10:
    print(f'num({num}) > 10')
else:
    print(f'num({num}) <= 10')

# 計算結果を特定の値と比較する
a = randint(1, 10)
b = randint(1, 10)

if (a + b) % 2 == 1# 「if (a + b) % 2:」と同値
    print(f'{a} + {b}: odd')
else:
    print(f'{a} + {b}: even')

# 文字列の等値比較
name = 'hitoshi'

if name == 'takeshi':
    print('takeshi, go study!')
else:
    print('you are free to do what you want')


 最初の例は単純に変数numの値が10より大きいかどうかを比較演算子「>」を用いて判断し、その結果に応じて異なる処理を行う。次の例は単純に変数の値を調べるのではなく、計算結果(2つの変数の和を2で割った余り)が1かどうかを比較演算子「==」を使って判断し、その結果に応じて処理を分岐している。最後の例では、数値ではなく、文字列の比較を行っている。

 2つ目の例では「(a + b) % 2 == 1」という条件を記述しているが、実はこれは「(a + b) % 2」とだけ書くこともできる。というのは、Pythonではオブジェクトの値そのものもTrueかFalseとして評価できるからだ。具体的には、以下のような値はFalseとなる。

  • 0(整数)、0.0(浮動小数点数値)などの数値0
  • 空文字列('')
  • 空のリスト、タプル、辞書、集合など、空のコンテナ

 これら以外はTrueとして扱われる。このことを利用すると、コードをよりシンプルに書けることがある。

 上の例の場合、「(a + b) % 2」の結果が1なら2つの変数の和が奇数であることを意味するが、数値「1」はTrueとしても解釈できるので「== 1」を省略しても結果は同じとなる。ただし、ここではコードの読みやすさを考慮してあえて残してある(上の例はif節とelse節しかないが、計算結果が0、1、2、3、……のいずれであるかに応じて分岐するといった場合には、その条件を明確にしておいた方がよいだろう)。

リストなどに特定の要素があるかを条件とする

 リストなど、多くの要素を格納するオブジェクトに、特定の値が含まれているかどうかを基に処理を分岐させたいこともある。このようなときには、比較演算子のうち、以下の2つを使う。

演算子 意味
x in s xがsに格納されているかどうか(xがsの要素かどうか)
x not in s xがsに格納されていないかどうか(xがsの要素ではないかどうか)
コンテナオブジェクトに要素が含まれているか含まれていないかを調べる比較演算子

 in演算子は、その左側に置いた値(上の表ではx)が、右側に置いた値(上の表ではs。ただし、sは文字列やリスト、タプル、集合、辞書など)に格納されていればTrueとなり、そうでなければFalseとなる。not in演算子は逆に、xがsに格納されていなければTrueとなり、そうでなければFalseとなる(つまり、これら2つの演算子は逆の条件を調べる)。

 以下に例を示す。

# 文字列の例
s = 'deep insider'
x = 'outside'

if x in s:  # 'deep insider'に'outside'が含まれているかどうか
    print('outsider')
else:
    print('insider')

# リストの例
s = [randint(0, 10) for x in range(5)]  # リストsの要素はランダム
x = 7

if x not in s:  # リストsに7が入っていれば当たり
    print('not hit')
else:
    print('hit')

# 辞書の例
s = {'a': 97, 'b': 98, 'c': 99, 'd': 100, 'e': 101}
x = 'b'

if x in s:  # in演算子は辞書に対してはキーの検索を行う
    print(s[x])


 最初の2つは文字列とリストに対して、in演算子/not in演算子で要素が含まれているかどうかを調べるものだ。最後の例は辞書を対象としているが、辞書を対象とした場合、in演算子はキーの存在確認を行うことに注意すること。

 また、既に上で述べたように、空の文字列やリストなどは、それ自体がFalseとして扱われる。このことを利用すると、文字列やリストが空かどうかで処理を分岐するコードは次のように書ける。

s = ''

if s:  # sが空ならFalse、空でなければTrue
    print('not empty')
else:
    print('empty')


オブジェクトの同一性を条件とする

 is演算子/is not演算子を使うと、2つの変数(オブジェクト)が同一のものであるかどうかを判定できる。

演算子 意味
x is y xとyが同一のオブジェクトを参照しているかどうか
x is not y xとyが異なるオブジェクトを参照しているかどうか
2つの変数が同じオブジェクトを参照しているか参照していないかを調べる比較演算子

 以下に例を示す。

# 2つのオブジェクトが同一であるかどうかを条件とする
s1 = 'deep insider'  # 2つの変数s1とs2は同じオブジェクトを参照する
s2 = s1
s3 = s1.lower()  # 変数s3は変数s1と内容は同じだが、別のオブジェクトを参照する

if s2 is s1:  # 変数s2とs1が参照するオブジェクトは同一
    print('two objects are identical')

if s3 is not s1:  # 変数s3とs1が参照するオブジェクトは別モノ
    print('two objects are not identical')

if s3 == s1:  # だが、その値は等しい
    print('two objects have a same value')


 変数s2には、変数s1を代入しているので、これらは同じオブジェクトを参照している。一方、変数s3にはs1にlowerメソッドを適用した結果得られる新しい文字列(その内容は同一)が代入されている。

 そのため、「s2 is s1」という条件はTrueとなる。一方、2つのオブジェクトが異なっていることを調べる「s3 is not s1」という条件もTrueとなる。ただし、変数s3と変数s1の値を「==」演算子で比較した場合には、これらは同じ文字列('deep insider')を格納しているのでTrueとなる。値が同じでも、別のオブジェクトというものが存在するので注意しよう。

複数の条件をまとめる/真偽を反転する

 if文で「もしAかつBなら」や「もしAかBなら」といった条件で処理を分岐させるには、論理演算子のandとorを使用する。また、True/Falseの反転には同じく論理演算子のnotが使える。

演算子 意味
a and b 条件aと条件bが同時に成り立つかどうか
a or b 条件aと条件bのどちらかが成り立つかどうか(同時に成り立ってもよい)
not a 条件の真偽(True/False)を反転する(TrueならFalseに、FalseならTrueに)
論理演算子

 以下に例を示す。

x = randint(1, 10)
y = randint(1, 10)

# and演算子の使用例
if x <= 5 and y <= 5:
    print(f'x={x}: 1-5, y={y}: 1-5')
elif x <= 5 and y > 5:
    print(f'x={x}: 1-5, y={y}: 6-10')
elif y <= 5# x >= 6は自明
    print(f'x={x}: 6-10, y={y}: 1-5')
else# y >= 6は自明
    print(f'x={x}: 6-10, y={y}: 6-10')

# or演算子の使用例
s = 'deep insider'
x = 'inside'
d = "don't care"
y = 'D'

if x in s or y in d:  # sに'inside'があるか、dに'D'があればTrue
    print(True)
else:
    print(False)

if y in d or x in s:  # dに'D'があるか、sに'inside'があればTrue
    print(True)
else:
    print(False)

# not演算子の使用例
s = ''

if not s:
    print('empty')
else:
    print('not empty')


 最初の例は2つの変数xとyの値(いずれも乱数で1〜10の範囲の整数となる)が1〜5と6〜10の範囲のどこにあるかを調べて、4種類の出力を行う。次の2つのif文では、2つの条件をor演算子でつないでいるが、その順番が逆になっている。そして、変数dの値と変数yの値から「y in d」は常にFalseとなることが分かっている。それでも、2つのif文の出力は同じくTrueとなる。最後の例は、空文字列かどうかを調べているが、not演算子を使うことで、空の場合に条件がTrueとなるようにしている。

 なお、最初の例のコードは以下と同値だが、どちらのコードがよりよいコードかは難しい判断だ。

# 上記の最初の例は以下と同値
x = randint(1, 10)
y = randint(1, 10)

if x <= 5:
    if y <= 5:
        print(f'x={x}: 1-5, y={y}: 1-5')
    else:
        print(f'x={x}: 1-5, y={y}: 6-10')
else# x >= 6は自明
    if y <= 5:
        print(f'x={x}: 6-10, y={y}: 1-5')
    else:
        print(f'x={x}: 6-10, y={y}: 6-10')


「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。