Python で条件分岐:if 構造と真偽値

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

条件分岐とは?

条件判断と処理分岐、あわせて「条件分岐」です。Python では、与えられた条件式を評価し、その結果に応じて処理内容を変えます。

基本

#if 条件式:
i = 0
if i == 0:
    print('i is zero!')

結果:

i is zero!

ifの後はブロックなので、インデントをしています。

復習:Python の for ループと文法

ここでは、if に与えられた条件 i == 0 が成立するときに続くブロックが実行されます。試しに、 i に代入する値を 1にすると、print 文が実行されません。このように、条件が成立することを Python などのプログラミング言語では、真であると表現します。

真であるか、その反対、偽であるかを判断するのが if 構造です。そして、その if に真や偽という情報を与えるのが条件式です。今回の例では i == 0が条件式に該当します。

i = 0

であれば代入式でしたが、

i == 0

比較式となります。

== 演算子は、左右の値が等しい時に真の値を返し、等しくなければ偽を返します。

真偽値

== 演算子が返す真か偽か、という情報は Python では真偽値、bool型と呼ばれます。

print(i == 0, type(i == 0))

結果:

True <class 'bool'>
※i = 1 など 0 以外を代入した場合
False <class 'bool'>

bool型はこのように True(真)かFalse(偽)かの2つの状態しか取らず、 if 構造などの入力によく使われます。また、スイッチのオン・オフのようにオプションのオン・オフに使われることもよくあります。ただ、初心者プログラマが自分で bool 型の変数を使うことは多くないかもしれません。条件式として直接 if 文へ記述するなどからスタートするでしょう。

条件式に使われる色々な真偽値を返す演算子

== 等しい

i = 0
i == 0 #True
i == 1 #False
i == 1.0 #False
i == 0.0 #True
i == '0' #False
i == int('0') #True
i == -1 #False

先の説明の通り、左右が等しいときに True となります。int と float では等しければ True を返しますが(こちらは注意が必要な場合があります)、int と str など、明示的な型変換(キャスト)が必要な場合は False を返します。

もちろん、明示的な型変換を行った後に等しければ True となります。

!= 等しくない

== と全く真逆の結果となります。

i = 0
i != 0 #False
i != 1 #True
i != 1.0 #True
i != 0.0 #False
i != '0' #True
i != int('0') #False
i != -1 #True

 > より小さい, < より大きい

数学の不等式と同様です。等しい時は偽を返します。

i = 0
i < 1 #True
i > 1 #False
i > 0 #False
i < 0 #False

>= 以下, <= 以上

数学の不等式と同様です。大小記号と、イコールの順番だけ間違えないようにします。等しい時も真を返します。

i = 0
i <= 1 #True
i >= 1 #False
i >= 0 #True
i <= 0 #True

日常会話では、以上とより大きい、以下とより小さいを区別しないこともありますが、プログラミングでは明確に区別されます。

真偽値の演算・条件の組み合わせ

真偽値はブール代数で演算ができます。というと難しく考えがちですが、「それと同時に(かつ)」や「または」、「そうではないとき」など、日常でも考えやすいシンプルな理屈です。

and それと同時に、両方の条件を満たすとき真(論理積)

i = 0
j = 10
i == 0 and i < 1 #True i は 0 かつ 1より小さい
i == 1 and i <= 1 #False i は 1 かつ 1以下(iが1の時は true)
i == 0 and j == 10 #True i が 0 かつ、j は 10。評価に使う変数は同じである必要はない
i < 1 and i > -1 #True i は 1 より小さく、かつ -1より大きい。数学のように -1 < i < 1 とも書ける

or または、どちらかが真なら真(論理和)

i = 0
j = 10
i == 0 or i == 1 #True iがゼロまたは 1 のとき真
i == 10 or j == 10 #True i が 10または j が 0のとき真
i == 0 or i > 0 #True, i >= 0 と同義

not そうでないとき、偽のときに真(論理否定)

i = 0
j = 10
not i == 1 #True i != 1 と同義
not i < 0 #True i >= 0 と同義
not i >= 0 #False i < 0 と同義

※数値の大小を評価する比較演算子のとき、演算子の向きが逆になるだけでなく、 = の有無も変わる点に注意

条件式を満たさないときに実行される else

if 構造のブロックは条件を満たしたときに実行されます。それ以降は、条件を満たしても満たさなくても実行されます。そのため、 iが0の時とそうでないときで処理を分けたいときは以下のように記述できます。

i = 1
if i == 0:
    print('i is zero!') #iがゼロのときに実行される
if i != 0:
    print('i is not zero!') #iがゼロでないときに実行される

しかし、このような記述は冗長で分かりづらいです。また、iに対する評価が2度行われていて処理としても冗長です。

幸い、これは以下のように記述できます。

i = 1

if i == 0: #i がゼロのとき
    print('i is zero!')
else: #それ以外のとき(iがゼロでないとき)
    print('i is not zero!') #iがゼロでないので実行される

else: 以降のブロックはその直前の if の評価式が偽の時だけ実行されます。非常によく使う形式です。

if の入れ子と elif

if 構造, if – else 構造は入れ子ができます。例えば、 i と j が両方ともゼロでないときに乗算を行うプログラムを見てみます。

i = 1
j = 10

if i == 0:
    print('i is zero!')
else:
    if j == 0:
        print('j is zero!')
    else:
        print('i * j is', i * j)

このようにelse のブロックの中に(もちろん if のブロックのなかでも)ifブロックを追加できます。しかし、このような入れ子構造はインデントが深くなり、見づらくなりがちです。

そこで、以下のように書き換えます。

i = 1
j = 10

if i == 0:
    print('i is zero!')
elif j == 0: #iがゼロでなくて、更に jがゼロでないとき
    print('j is zero!')
else: #全ての条件を満たさないとき
    print('i * j is', i * j)

elif は、 else if(その他のときに、もし~~であれば)の省略系です。最初の if 、またはひとつまえの elif の条件を満たさないときに条件式を評価します。elif を使っても、else: ブロックを使用することができます。それまでの全ての条件を満たさないときに else が実行されます。

なお、上記は以下のように書き換えることも可能です。

i = 1
j = 10

if i == 0 or j == 0:
    print('i or j or both are zero!')
else:
    print('i * j is', i * j')

ただし、i と j のどちらがゼロか? を表示することはできません。論理式によってまとめられる場合でも、目的によっては敢えて複数の if で評価する場合があります。

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

最新の記事