Pythonのif andで複数の条件を全て満たす場合の処理を一行で書く方法

Python で、「条件の全てを同時に満たす場合」と「それ以外の場合(条件を 1 つでも満たさない場合)」の処理を書くには、if and を使います。

これを使うことによって、if 文の条件式を、非常に簡潔で、誰から見ても分かりやすく書くことができるようになります。 これは他のプログラミング言語には見られない Python の特徴的な書き方の一つです。

Python を使いこなして、より良いコードを書く上で、必須のスキルですので、ここでしっかりと抑えておきましょう。

Python の if 文の基本
if else 文の学習の前に「Pythonのif文を使った条件分岐の基本と応用」で、if 文の基礎を抑えておきましょう。

目次

1. if and 文は「条件を全て満たす場合」の処理に使う

if and 文は、複数の分岐条件があって、「その条件を全て満たす場合」というコードを簡単に書くために使います。

通常、「全ての条件を満たす場合」と「それ以外の場合(条件を 1 つでも満たさない場合)」の処理を分けるには、 if 文をネスティングします。「ネスティング」とは if 文の中に、別の if 文を作ることをといいます。

以下の図をご覧ください。

外側の点線で囲った範囲が外側の if 文で、内側の点線で囲った範囲が内側の if 文(ネスティングされた if 文)です。

この図では、外側の if 文に、

if size >= 10: #もしサイズが 10 以上なら

と書いています。

この条件を満たさない場合は「不合格」となって、そのまま if 文を抜けます。条件を満たしている場合は、今度は、内側の if 文(ネスティングされた if 文)に進み、そこで、

if weight >= 25: #もし重量が 25 以上なら

という条件が与えられます。この条件を満たす場合は「合格」、それ以外は「不合格」です。

つまりこの図は、サイズが 10 以上、重量が 25 以上という 2 つの条件を同時に満たす場合のみ「合格」、それ以外の場合は「不合格」を返すプログラムを表します。

これをコードで書くと、次のようになります。

In [1]:
'''randomモジュールのrandint関数の読み込み'''
from random import randint
 
'''実行の度にランダムに数値を返す'''
size = randint(5,20) 
weight = randint(20, 40)
 
'''外側の if 文です。'''
if size >= 10 : #もしサイズが 10 以上なら内側の if 文に移ります。
    '''外側の if 文のすぐ後に内側の if 文を書きます。'''
    if weight >= 25 : #もし重量が 25 以上なら合格です。
        result = "合格"
    else : #もし重量が25に満たない場合は不合格です。
        result = "不合格"
else : #外側の if 文の else です。サイズが10に満たない場合は不合格です。
    result = "不合格"
     
'''結果を出力します。'''
text = f"サイズ{size}、重量{weight}:{result}"
print(text)
サイズ7、重量25:不合格

このように外側の if 文の中 (外側の if 文とelse 文の間)に、内側の if 文を書きます。

しかし、この書き方は、コードの見た目が、なんとなくスッキリしませんし、書いている時にも間違えてしまいそうです。そこで、Python では if 文と 演算子の and を組み合わせて、複雑な条件分岐を、スッキリ分かりやすく書けるようになっています。

次から見ていきましょう。

2. if and によるネスティングの簡素化

Python で、「全ての条件を満たす場合は処理 A 」と「条件を 1 つでも満たさない場合は処理 B 」というような条件分岐を作る場合は、if 文をネスティングするよりも if and 式を使う方が、間違いも起こりにくいですし、より美しいコードになります。

実例を見ることで、そのことによるメリットは一目で分かります。

2.1. if and で複数の条件を一行で表す ①

上と同じコードは、if and を使うと、次のように書くことができます。コードが短くなり、より読みやすくなっていることが分かります。

In [1]:
'''randomモジュールのrandint関数の読み込み'''
from random import randint
 
'''実行の度にランダムに数値を返す'''
size = randint(5,20) 
weight = randint(20, 40)
 
'''ここから if and 文です。'''
if size >= 10 and weight >= 25:
    result = "合格"
else:
    result = "不合格"
print(f"サイズ{size}、重量{weight}:{result}")
サイズ16、重量28:合格

最初のコードでは、

if size >= 10 :
    if weight >= 25 :
        result = "合格"
    else :
        result = "不合格"
else :
    result = "不合格"

と条件を分けて書いていたものを、and を使って、一行の if 文にまとめています。

if size >= 10 and weight >= 25:
    result = "合格"
else:
    result = "不合格"

これだけで、コードも短くなって、見た目も分かりやすさも、はるかにスッキリしましたね。これを図にすると次のようになります。

このように、if and 文は、「全ての条件を満たす場合のみ行う処理」と、「条件を 1 つでも満たさない場合に行う処理」を分けたい場合に、非常に便利です。先ほどのネスティングした場合の図と見比べてみてください。全く同じ条件のコードを、1 つの if 文だけで作ることができています。

2.2. if and で複数の条件を一行で表す ②

if and で作る分岐条件は、いくつあっても構いません。

次の例は、if and を使って、3 つの条件を全て満たしているかどうかで合否を決めるプログラムです。数学(math)と化学(science) の両方が 40 点以上、合計が 120 点以上という 3 つの条件を同時に満たす場合のみ合格というものです。

In [1]:
'''randomモジュールのrandint関数の読み込み'''
from random import randint
 
'''実行の度にランダムに数値を返す'''
math = randint(0,100) #0~100の乱数
science = randint(0, 100)
 
'''if and 文は and で繋いだ全ての条件を満たす場合のみ合格です。'''
if math >= 40 and science >= 40 and (math + science) >= 120 :
    result = "合格"
else :   #条件をどれか 1 つでも満たさない場合は不合格です。
    result = "不合格"
     
'''結果の出力'''
text = f"数学{math}点、化学{science}点、合計{math+science}点: <{result}>"
print(text)
数学83点、化学80点、合計163点: <合格>

if 文の条件式を、次の一行だけで書いています。

if math >= 40 and science >= 40 and (math + science) >= 120:

これを if and を使わずに、if 文のネスティングだけで書こうとすると、次のようになってしまいます。

if math >= 40:
    if science >= 40:
        if (math + science) >= 120:
            result = "合格"
        else:
            result = "不合格"
    else:
        result = "不合格"
else:
    result = "不合格"

一目見ただけでは混乱してしまいますね。コードの内容を素早く理解することはとても難しいです。一方で if and の場合は、見た目もスッキリしていて、一目でコードの内容を理解することができます。

このような利点があるので、Python では、ネスティングではなく if and を使うことが基本です。

3. and も抜いて、さらに簡素化する

Pythonでは、if and 文の and すら抜くことができる場合があります。

それは、

if  (5 <= score) and (score <=  8) :

のように、左項も右項も、同じ対象(この場合は score)を比較している場合です。これは、

if 5 <= score <= 8:

というように and を抜いて、さらに簡素化することができます。

次の例をご覧ください。 得点が 5 点以上 8 点以下の時に「合格」と返すプログラムです。

In [1]:
'''randomモジュールのインポート'''
from random import randint
score = randint(0, 10) #0~10の乱数
 
'''if 文'''
if 5 <= score <= 8 :
    print(f"{score}点:  合格")
else :
    print(f"{score}点:  不合格")
4点:  不合格

これもコードをより簡潔で分かりやすく書くために、頻繁に活用するものなので、覚えておきましょう。

4. まとめ

ここまで見てきたように、Python で、「全ての条件を同時に満たす場合」と「それ以外の場合」を別々の方法で処理するコードを書くには、ネスティングではなく if and を使います。

ネスティングでも動作はしますが、コードの見た目がスッキリせず、他人から見て、とても分かりづらいコードになってしまいます。また、コードが長くなることで、プログラムの全体的な処理速度にも悪影響を与えてしまいます。

if and のような条件式の簡素化は、Python で良いコードを書くには必須のスキルですので、是非覚えておきましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

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

目次
閉じる