if文の条件式にbool型以外のオブジェクトを与えた場合の動作

if文の条件式には、Bool型の式を入れるというのが基本的な使い方ですが、Bool型でない式を入れることもできます。具体例で見てみましょう。


変数statusの値が空文字またはNULLであれば状態が空であることを表示し、
変数statusの値が上記以外であればstatusの値を表示するプログラムは以下のように書けます。

test_params = ('good', '', None)
for status in test_params:
    if status == '' or status is None:  # この部分に注目
        print("Status is empty.")
    else:
        print(f"Status is {status}.")
# 出力
#    Status is good.
#    Status is empty.
#    Status is empty.

ところで、上記の if文のところ if status == '' or status is None: は if not status: と書き換えてひとまとめにすることができます。

test_params = ('good', '', None)
for status in test_params:
    if not status:  # この部分に注目
        print("Status is empty.")
    else:
        print(f"Status is {status}.")
#  出力
#     Status is good.
#     Status is empty.
#     Status is empty.

これは、status の値が '' または None であることはいずれも偽 (False) だと解釈されるというルールを利用したものです。

公式ドキュメントに下記のような説明があります。

ブール演算のコンテキストや、式が制御フローの文で使われる際には、次の値は偽だと解釈されます: False 、 None 、すべての型における数値の 0、空の文字列、空のコンテナ (文字列、タプル、リスト、辞書、集合、凍結集合など)。 それ以外の値は真だと解釈されます。 ユーザ定義のオブジェクトは、 bool() メソッドを与えることで、真偽値をカスタマイズできます。

公式ドキュメント 6.11 ブール演算

公式ドキュメントの説明によると、数値の0や空のコンテナなどもすべて偽 (False) として解釈されるので、下記のように拡張されます。

test_params = ('good', '', None, [], {}, (), 0, 0.0, False)

for status in test_params:
    if not status:
        print("Status is empty.")
    else:
        print(f"Status is {status}.")
# 出力
#     Status is good.
#     Status is empty.
#     Status is empty.
#     Status is empty.
#     Status is empty.
#     Status is empty.
#     Status is empty.
#     Status is empty.
#     Status is empty.

いろいろな文字列、コンテナ、数値、などの色々な型で「値なし」に相当するものをひとまとめに扱いたいときに便利です。


\Pythonを基礎から勉強したい方向け「プログラミング入門コースお気軽にご相談ください

無料カウンセリングを予約する