Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

【Pythonお悩み解決】複数のifの実行順を調整してエラーを解消

こんにちはPyQサポートです。 今回は複数のifの実行順を調整してエラーを解消する方法について紹介します。

質問:以下のコードを実行するとエラーになりました。 n には数値か None が入るはずなので、このように判定しているのですが、なぜでしょうか。

>>> n = None
>>> if n == 0:
...     print("n == 0")
... elif n > 0:
...     print("n > 0")
... elif n < 0:
...     print("n < 0")
... elif n is None:
...     print("n is None")
... 
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
TypeError: '>' not supported between instances of 'NoneType' and 'int'

回答:Noneに大小の比較演算子は使えないからです。

エラーメッセージを見ると elif n > 0: の箇所で TypeError が発生しています。「演算子 > は、 'NoneType'int の比較をサポートしていません」というメッセージが表示されていますね。

この条件文は、 n0 (整数)または None との比較を行っています。 以下のように、 None と整数値の is== による比較はエラーになりませんが、大小比較はエラーとなります。

>>> None == 0
False
>>> None is None
True
>>> 0 is None
False
>>> None > 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'NoneType' and 'int'

このため、 elifNone と整数の大小比較が行われないように、最初の if 文で nNone の場合について判定しておくことで、エラーを回避できます。

書き直したコード

>>> n = None
>>> if n is None:
...     print("n is None")
... elif n == 0:
...     print("n == 0")
... elif n > 0:
...     print("n > 0")
... elif n < 0:
...     print("n < 0")
n is None

他にもPython 3.10 で追加された match ... case を使う方法もあります。 match ... case については、以下のブログで紹介しています。

blog.pyq.jp

PyQで、Noneの扱い方を学びましょう

PyQでは、 Noneの扱い方 を学習できます。

Copyright ©2017- BeProud Inc. All rights reserved.