連載
» 2022年05月17日 05時00分 公開

[解決!Python]if文にand/or演算子を使って複数の条件を記述するには解決!Python

if文の条件として、複数の条件をand/or演算子を使ってひとまとめにして記述する方法や注意すべきポイントなどを紹介する。

[かわさきしんじ,Deep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

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

連載目次

# 複数の条件が全て成立するかどうかをチェック:and演算子
a = 'foo'
b = 'bar'

if a == 'bar' and b == 'foo'# False and False == False
    print('bar foo')
elif a == 'bar' and b == 'bar'# False and True == False
    print('bar bar')
elif a == 'foo' and b == 'foo'# True and False == False
    print('foo foo')
elif a == 'foo' and b == 'bar'# True and True == True
    print('foo bar')
else:
    print('other')

# 複数の条件のいずれかまたは全てが成立するかどうかをチェック:or演算子
a = 'foo'
b = 'bar'

if a == 'bar' or b == 'foo'# False or False == False
    print('bar or foo')
elif a == 'bar' or b == 'bar'# False or True == True
    print('bar or bar')
elif a == 'foo' or b == 'foo'# True and False == True
    print('foo or foo')
elif a == 'foo' or b == 'bar'# True and True == True
    print('foo or bar')
else:
    print('other')

# 短絡評価
def f():
    print('f called')

x = 1
if x == 1 and f():  # f called
    pass
    
if x == 0 and f():
    pass

if x == 1 or f():
    pass

if x == 0 or f():  # f called
    pass

# 3つ以上の条件(and演算子とor演算子の組み合わせ)
values = [(150, 200, 100), (200, 300, 100), (0, 0, 300)]

for x, y, z in values:
    if 100 <= x and 300 <= y or 200 < z:
        print('foo')
    else:
        print('bar')
# 出力結果:
# bar
# foo
# foo

# 演算子の優先順位
a, b, c = 2, 1, 0

if result := a or b and c:  # and > orなので「b and c」が先に評価される
    print('True:', result)
else:
    print('False:', result)
# 出力結果:
# True: 2

if result := not a or b and c:  # 「not a」「b and c」「結果1 or 結果2」の順
    print('True:', result)
else:
    print('False:', result)
# 出力結果:
# False: 0

# and演算子を省略
# and演算子を省略していない書き方
n = 156
if 0 <= n and n < 100# どちらも不成立
    print('0 <= n < 100')
elif 100 <= n and n < 150# 一方だけが成立
    print('100 <= n < 150')
elif 150 <= n and n < 200# どちらも成立
    print('150 <= n < 200')

# 上のコードは下のようにも書ける
n = 156
if 0 <= n < 100# どちらも不成立
    print('0 <= n < 100')
elif 100 <= n < 150# 一方だけが成立
    print('100 <= n < 150')
elif 150 <= n < 200# どちらも成立
    print('150 <= n < 200')


複数の条件が全て成立するかどうかをチェック:and演算子

 if文で条件分岐をする際に、複数の条件が成立しているかどうかや、複数の条件のいずれかが成立しているかどうかがポイントになることがある。こうしたときには、and/or演算子を用いて、複数の条件をまとめて記述できる。

  • and演算子:複数の条件が全て成立(True、真)のときにTrue(真)となる
  • or演算子:複数の条件のいずれか1つでも成立すればTrueとなる(全ての条件の値がTrueでもよい)

 複数の条件全てが成立したときに特定の処理を実行したければ、if文の条件として「式0 and 式1 and …… and 式n」のように条件を記述する式をand演算子でつないで記述する。and演算子では、その両側にある2つの式が共に成立すれば、全体としての条件が成立して、その値がTrueとなる。日本語で読み下すときには「and」は「かつ」と読める。

 以下に例を示す。これは変数aとbの値と文字列'foo'と'bar'とを比較している。

a = 'foo'
b = 'bar'

if a == 'bar' and b == 'foo'# False and False == False
    print('bar foo')
elif a == 'bar' and b == 'bar'# False and True == False
    print('bar bar')
elif a == 'foo' and b == 'foo'# True and False == False
    print('foo foo')
elif a == 'foo' and b == 'bar'# True and True == True
    print('foo bar')
else:
    print('other')


 この例では、if文で上から順に以下の条件をテストしている。

  • a == 'bar' and b == 'foo':変数aの値が'bar'「かつ」変数bの値が'foo'かどうか
  • a == 'bar' and b == 'bar':変数aの値が'bar'「かつ」変数bの値が'bar'かどうか
  • a == 'foo' and b == 'foo':変数aの値が'foo'「かつ」変数bの値が'foo'かどうか
  • a == 'foo' and b == 'bar':変数aの値が'foo'「かつ」変数bの値が'bar'かどうか

 一方、if文の前で変数aには'foo'が、変数bには'bar'が代入されている。よって、「a == 'foo'」「b == 'bar'」の2つand演算子でつないでいる最後の条件が全体としては真となり、他の条件はFalseとなる。結果、最後のelif節のコードが実行され「foo bar」と表示される。

複数の条件のいずれかまたは全てが成立するかどうかをチェック:or演算子

 複数の条件のいずれかまたは全てが成立したときに特定の処理を実行したければ、if文の条件として「式0 or 式1 or …… or 式n」のように条件を記述する式をor演算子でつないで記述する。or演算子では、その両側にある2つの式のいずれかが成立すれば、全体としての条件が成立して、その値がTrueとなる。日本語で読み下すときには「or」は「または」と読める。

 以下に例を示す。先ほどと同様、変数aとbの値と文字列'foo'と'bar'とを比較している。

a = 'foo'
b = 'bar'

if a == 'bar' or b == 'foo'# False or False == False
    print('bar or foo')
elif a == 'bar' or b == 'bar'# False or True == True
    print('bar or bar')
elif a == 'foo' or b == 'foo'# True and False == True
    print('foo or foo')
elif a == 'foo' or b == 'bar'# True and True == True
    print('foo or bar')


 この例では、if文で上から順に以下の条件をテストしている。

  • a == 'bar' or b == 'foo':変数aの値が'bar'「または」変数bの値が'foo'かどうか
  • a == 'bar' or b == 'bar':変数aの値が'bar'「または」変数bの値が'bar'かどうか
  • a == 'foo' or b == 'foo':変数aの値が'foo'「または」変数bの値が'foo'かどうか
  • a == 'foo' or b == 'bar':変数aの値が'foo'「または」変数bの値が'bar'かどうか

 一方、if文の前で変数aには'foo'が、変数bには'bar'が代入されている。よって、最初の条件である「a == 'bar' or b == 'foo'」のみは2つの条件がどちらも成立しないので、全体としても評価結果はFalseとなるが、他の条件についてはいずれか、もしくは両方が成立するのでTrueとなる。結果、2つ目の条件が成立した際に「bar or bar」と表示され、if文の実行が終了する。

短絡評価

 and演算子やor演算子では、その両側にある2つの式が両方とも実行されるとは限らない。というのは、and演算子は2つの条件が「どちらもTrue」であるときにその結果がTrueとなる。そのため、最初に評価される条件(左側の式)の値がFalseとなった時点で条件全体の値がFalseとなることが決まる。この場合、もう1つの条件を評価する意味はないので、その条件は評価されない。こうした処理のことを「短絡評価」と呼ぶことがある。

 以下に例を示す。

def f():
    print('f called')

x = 1
if x == 1 and f():  # f called
    pass
    
if x == 0 and f():
    pass


 この例では呼び出されると「f called」と表示するだけの関数を定義して、if文の条件として、and演算子の右側(2番目に評価される条件)にその関数呼び出しを記述している。

 最初のif文では、「x == 1」と「f()」がand演算子でつながれている。つまり、全体としての条件は「x == 1かつf関数の呼び出し結果が真かどうか」である(ただし、f関数は何も返さないのでこの条件自体は成立しない。が、ここでは本題とは関係ない)。このとき、「x == 1」という条件は成り立つので、もう1つの条件である「f()」が実行されて、コンソールには「f called」と表示されるはずだ。

 次のif文では、「x == 0」を評価した時点で、その結果がFalseなのでf関数を呼び出さずとも、全体の値がFalseであることが決まる。そのため、f関数は呼び出されず「f called」とも表示されない。

 or演算子でも同様で、最初に評価される条件(左側の式)の値がTrueとなった時点で、全体としての条件はTrueとなることが決まる。このときには、やはりもう1つの条件は評価されない。

 以下に例を示す。or演算子では1つ目の条件がFalseのときに、全体としての条件がTrueとなるかどうかをテストする必要があるので、2つ目のif文でf関数が呼び出されることに注意されたい。

if x == 1 or f():
    pass

if x == 0 or f():  # f called
    pass


3つ以上の条件(and演算子とor演算子の組み合わせ)

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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