Python Noneの判断のやり方

Python学習【365日チャレンジ!】36日目のマスターU(@Udemy11)です。

知り合いからネットワークプリンターの再設定を頼まれたはいいものの、印刷できずに、ドライバーを入れては消しての無限ループに!?はまってしまいました。

原因は最も基本的なことで、プリンターが別ネットワークの固定IPを振られていたにも関わらず、セグメントが違うIPで設定していたからでした。

プリンタ本体のIP設定を確認せずにネットワークプリンターを設定しようとするなんて、初歩中の初歩でつまづいていたにも関わらず、なかなか気づくことができませんでした。

灯台もとぐらしってこのことだな〜と反省した次第です。

さて、今日は、空の値と同じような使い方をされるNoneの学習です。

昨日の復習

昨日は、値が空かどうかを判断するための方法を学習しました。

ifのあとに、変数だけを記載した場合は、値が空かどうかを判断するBoolean型で認識されました。

is_ok = True
if is_ok:
    print('OK')

他にもリストの中に何も値が入っていないときの判断は、次のようなコードだと、Trueと判断されて、’OK’が出力されました。

is_ik = []
if is_ok:
    print('OK')

この場合は、リストの中身が空っぽなので、is_okはFalseを返してif文を抜けるので、’OK’は出力されません。

if 変数:

と記載されるときは、変数が値を持っているかどうかが判断され、値があれば、Trueを返して、値が空であれば、Falseを返します。

Falseが返される場合の各タイプの値は次のとおり。

  • False(Bool型)
  • 0(int型)
  • 0.0(float型)
  • [](list型)
  • ()(tuple型)
  • {}(dict型)
  • set()(set型)

複数の値が代入されるリスト型などであれば、変数の条件を「長さが0の場合」などの指定をして、TrueかFalseを返すことで、次の行のコードを実行させるような使い方をしなくても、【if 変数:】とするだけで、値が空かどうかを判断することができます。

x = (1, 2, 3, 4, 5)
if x:
    print('exist')

このような感じで、非常にシンプルにコードを書くことができるわけですね。

今日は、その空の値と同じような使い方がされるNoneについて学習します。

Noneは何も存在しない

【空の値】と【何も存在しない】というのは、似て非なるものです。
空の値の場合は、入れる箱が存在していますが、何も存在しなければ、箱もありません。

例えば

box = []

というのは、空のリストで、if文を利用して変数boxを判断すれば、Falseが返されますが、Noneではありません。

box = None

と指定したら、boxはNone型になります。
この場合は、boxはTrueでもFalseでもなくNoneです。

当たり前のことなんですが、ちょっとわけがわからないですよね。

Noneというのは、Noneという「何も存在しない」値?状態?だけを持っているNone型なので、かなり特殊な状態です。

None型の判断

変数がNoneであるかどうかを判断するときは、演算子の【is】を使って判断します。

box = None
if box is None:
    print('yes')

もちろん、等しいという条件である【==】を使っても、Trueが返されるのですが、Noneの判断をする場合は【is】を使うのが暗黙のルールのようです。

【==】と【is】は微妙に違う

【==】と【is】は同じように感じるかもしれませんが、微妙に意味が違ってきます。

次のようなprint出力をしてみると結果が違うことに気づきます。

print(1 == True)
print(1 is True)

出力結果

True
False

昨日学習した「値が空かどうかを判断する方法」で学習しましたが、1はBoolean型のTrueなので、【==】でTrueかどうかを判定すると、Trueが出力されます。

一方【is】で判定する場合は、1そのものとTrueが同じかどうかを判定するので、Falseが出力されます。

【is】は、比較する値自体が同じかどうかを判断するので、比較演算子と同じ使い方をするとややこしくなります。

なので、

【is】はNoneを判断するときに使う

とおぼえておきましょう。

効率化を夢見て

普段、エクセルを使う機会があるのですが、最近ではGoogleのスプレッドシートを使う人のほうが多いんじゃないかと感じています。

エクセルはどうしても関数に頼ってしまい、VBAを学習しなくてもやりたいことができていました。

PythonはGoogleスプレッドシートを操作したり、Webサイトのスクレイピングができたりするので、最終的に、ボタン一つで作業を効率化できるようなプログラムを書けるようになることを目標にしています。

まだ現状では、基礎の基礎、初歩の初歩で、土台を固めているところなので、焦らず、のんびり、確実に一つひとつ学んで行こうと思います。

ではでは、明日もGood Python!