この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
# 複数の条件が全て成立するかどうかをチェック: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')
if文で条件分岐をする際に、複数の条件が成立しているかどうかや、複数の条件のいずれかが成立しているかどうかがポイントになることがある。こうしたときには、and/or演算子を用いて、複数の条件をまとめて記述できる。
複数の条件全てが成立したときに特定の処理を実行したければ、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文で上から順に以下の条件をテストしている。
一方、if文の前で変数aには'foo'が、変数bには'bar'が代入されている。よって、「a == 'foo'」「b == 'bar'」の2つand演算子でつないでいる最後の条件が全体としては真となり、他の条件はFalseとなる。結果、最後のelif節のコードが実行され「foo bar」と表示される。
複数の条件のいずれかまたは全てが成立したときに特定の処理を実行したければ、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文で上から順に以下の条件をテストしている。
一方、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
Copyright© Digital Advantage Corp. All Rights Reserved.