Python で if not 文は、「ある条件を満たさない場合」に行う処理を書くときに使います。
これを、if and や if or と組み合わせて使うと、「この条件は満たすけど、あの条件は満たさない場合」「複数の条件を同時に満たさない場合」など、様々な条件分岐を、素早く作ることができるようになります。
それ以外にも、「文字列やリストが空の場合」の処理なども個別に行うことができるようになります。
ぜひ、それぞれの使い方を確認しておきましょう。
if else 文の学習の前に「Pythonのif文を使った条件分岐の基本と応用」で、if 文の基礎を抑えておきましょう。
1. if not 文は「条件を満たさない時」の処理に使う
if 文は、「もし ○○ という条件を満たす場合は、△△ という処理を行う」というものです。これに否定形が加わって、if not 文になると「もし ○○ という条件を満たさない場合は、△△ という処理を行う」というものになります。
ちょうど下図のような流れですね。
これを使うことで、if 文だけでは表せない条件を作ることができます。
以下の例をご覧ください。
'''randomモジュールのrandint関数の読み込み'''
from random import randint
'''実行の度にランダムに数値を返す'''
score = randint(0, 100)
''' if not 文'''
if not score <= 50:
print(f"{score}点:合格")
else:
print(f"{score}点:不合格")
このコードの if 文は次のように書いています。
if not score <= 50:
これは、score が 50 点以下ではない場合に合格で、それ以外の場合は不合格となるコードです。このように、if not 文は、先に if not と書いてから条件式を書きます。最初は、not を書く場所に迷うかもしれませんので、覚えておいて下さいね。
2. if not と if and の組み合わせ
if not 文を、and や or と組み合わせると、さらに自由度の高い分岐条件を作ることができるようになります。
次の例をご覧ください。
'''点数を指定します。'''
math = 40
science = 100
'''if or 文は or で繋いだ条件を1つでも満たす場合に合格です。'''
if not math <= 50 and not science <= 50 and (math + science) >= 120 :
result = "合格"
else : #条件をどれか 1 つでも満たさない場合は不合格です。
result = "不合格"
'''結果の出力'''
print(f"数学{math}点、科学{science}点、合計{math+science}点: <{result}>")
このコードの条件式は次のように書かれています。
if not math <= 50 and not science <= 50 and (math + science) >= 120 :
if and 文は、「and で繋いだ条件を全て満たす場合」の処理を指定できるものでしたね(参照:「Pythonのif andで複数の条件を全て満たす場合の処理を一行で書く方法」)。
今回は、 if not 文なので
- 数学:50 点以下(not math <= 50)
- 科学:50 点以下(not science <= 50)
- 合計点:120 点以下(not (math + science) <= 120)
という 3 つの条件を、「全て満たさない場合にのみ」合格となるプログラムになります。結果を見てみると、科学の点数と合計点は条件を満たしているのですが、数学のみ 40 点で条件を満たしていないため、「不合格」と判定されています。
3. if not と if or の組み合わせ
if and 文を if or 文に変えると結果は変わります。
以下をご覧ください。
'''点数を指定します。'''
math = 40
science = 100
'''if or 文は or で繋いだ条件を1つでも満たす場合に合格です。'''
if not math <= 50 and not science >= 50 or (math + science) >= 140 :
result = "合格"
else : #条件をどれか 1 つでも満たさない場合は不合格です。
result = "不合格"
'''結果の出力'''
print(f"数学{math}点、科学{science}点、合計{math+science}点: <{result}>")
このコードの条件式は次のようになっています。
if not math <= 50 and not science >= 50 or (math + science) >= 140 :
if or 文は、「それぞれの条件のうち、どれか一つでも満たす場合」の処理を書くためのものでしたね(参照:「Pythonのif or でいずれか1つでも条件を満たす場合の処理を一行で書く方法」)。
そのため、このコードは、 and で繋いだ 2 つの条件、「数学が 50 点以下でないこと」、「科学が 50 点以下でないこと」を同時に満たす場合、または、それぞれの点数に関係なく、or で繋いだ条件である合計点が 140 点以上の場合に合格となるプログラムです。
結果を見てみると、数学が 40 点のため、最初の条件は満たしていません。しかし、合計点は 140 点で or で繋いだ条件を満たしているため合格と判定されています。
4. if not 文で「要素が空の場合」の処理を作る
ここまでは、if not 文で「ある条件を満たさない場合」の処理を作る方法を見てきました。
実は if not 文には、もう一つ便利な使い方があります。それが「要素が空の場合」の処理を書く時の使い方です。これを使いこなすには、Python の True と False の内部処理を知っておくと役に立ちます。
4.1. Python は True = 1 , False = 0 と判定する
Pythonでは True は 1, False は 0 として処理します。以下をご覧ください。
'''論理値 True は 1, 論理値 False は 0 です。'''
print(False + False) # 0 + 0
print(False + True) # 0 + 1
print(True + True) # 1 + 0
それぞれ False = 0, True = 1 として計算されていますね。
そして、以下の値は、Python 内の処理上、 0 と処理されます。これはつまり、 if 文では Falseと判定されることを意味します。
- False
- None
- 数値の 0、 0.0、 0j
- 空の値 “”、()、[]、{}
この特徴を利用すると、「要素が空の場合」という条件分岐を作ることができます。
4.2. if not 要素が空のオブジェクトの例
次のコードをご覧ください。
'''空の変数 name を作ります。'''
name = "" # 空の文字列は False と判定されます。
'''if not 文'''
if not name: # not で name が空の時に True と判定されます。
name = "匿名"
print(name)
これは、変数 name が空の時に「匿名」と入力するプログラムです。if 文に注目しましょう。
if not name:
これは name が False の時にという分岐条件です。name の値は空なので、if 文によって False と判定され指定の処理を行います。
空の文字列だけでなく、空のリストもタプルも辞書も False と判定されますので、if not 文でそれらだけに行う処理を指定することができます。また、数値の 0 や 0.0, 0j も同様です。
以下をご覧ください。
number = 0
if not number:
number = 100
print(number)
数値の 0 は False と同じ意味があるので、 if not 文で、0 の数値が入った変数だけに対する処理を描くことができます。
5. まとめ
まとめると if not 文には以下の 2 つの機能があります。
- ある条件を満たさない場合という条件分岐を作る。
- あるオブジェクトの要素が空の場合という条件分岐を作る。
特に、後者は、意外と知らない方も多いので覚えておくと良いでしょう。
また、if not と if or, if and を組み合わせると、通常は、何重にもネスティングして書かなければいけない条件分岐を、たった一行で表せるようになります。
しっかりと抑えておきましょう!
コメント
コメント一覧 (1件)
Pythonは初心者です。「not」の扱いが分からず、こちらに辿り着きました。お教えいただき、ありがとうございます。
ところで、以下の箇所ですが、120点未満(not (math + science) < 120)でなく、120点以下になるのですか?
if not math <= 50 and not science = 120 :
合計点:120 点以下(not (math + science) <= 120)