閉じる

Pythonの真偽判定 Truthiness入門:「if」でTrue/Falseになる条件一覧

Pythonではif文の条件式に必ずしもTrue/Falseそのものを書く必要はありません

数値やリスト、文字列など、さまざまな値をそのまま書いても、自動的に「真」か「偽」かに解釈されます。

この仕組みを「Truthiness(真偽判定の規則)」と呼びます。

本記事では、Pythonがどのように値をTrue/Falseとみなしているのかを体系的に整理し、実践的な使い方と注意点まで詳しく解説します。

Pythonの真偽判定(Truthiness)とは

Truthinessとは何か

Truthinessとは、Pythonが値を条件式で評価するときに「真として扱うか」「偽として扱うか」を決めるためのルールのことです。

Pythonでは、if文やwhile文などの条件式に、次のようにさまざまな型の値を書くことができます。

Python
if [1, 2, 3]:
    print("リストはTrue扱い")

このとき、if文のかっこ内ではbool([1, 2, 3])が内部的に呼び出され、その結果がTrueかFalseかで分岐が決まります。

つまり、条件式は必ず最終的にbool型のTrue/Falseに変換されてから評価されています

真偽判定が行われる代表的な場面

Pythonでは、次のような場面でTruthinessが使われています。

  • if文、elif文、while文の条件式
  • and / or / not の論理演算
  • 組み込み関数any()all()の評価
  • 条件付き式x if cond else ycond部分

これらはいずれも「値 → boolに変換 → True/Falseで判定」という流れで動いています。

bool()関数とTruthinessの関係

Pythonにはbool()という組み込み関数があり、「この値はTrueなのかFalseなのか」を確認できます。

Python
print(bool(1))        # 非ゼロの数値
print(bool(0))        # 0
print(bool(""))       # 空文字
print(bool("abc"))    # 非空文字列
print(bool([]))       # 空リスト
print(bool([1, 2]))   # 要素ありリスト
実行結果
True
False
False
True
False
True

このbool()の結果が、そのままTruthinessの判定基準になっています。

真偽値bool型とその他の型の関係

Pythonには真偽値専用の型としてboolがあります。

代表的な値は次の2つです。

  • True
  • False

これらは実はint型のサブクラスであり、数値としても扱うことができます。

Python
print(isinstance(True, bool))
print(isinstance(True, int))
print(True == 1, False == 0)
print(True + True, False + 5)
実行結果
True
True
True True
2 5

このように、True/Falseは数値的には1/0と等価ですが、条件分岐では「論理的な意味」で使うことがほとんどです。

すべての値はboolに変換可能

Pythonでは、すべてのオブジェクトはboolに変換可能です。

組み込み型であれば、後述するルールに従い、TrueかFalseに決まります。

カスタムクラスであっても__bool__()__len__()を定義することで、自分だけのTruthinessルールを持つことができます。

if文が評価しているのは「値」そのもの

if文の条件式は「TrueかFalseか」だけを見ているのではなく、「値をboolに変換した結果」を見ています

つまり次の2つは同じ意味です。

Python
value = [1, 2, 3]

# どちらも同じ意味
if value:
    ...
if bool(value):
    ...

この仕組みを理解しておくと、わざわざ== True!= 0のような冗長な書き方を避け、よりPythonicなコードを書けるようになります

Trueと判定される値のパターン

Truthinessでは「False扱い」になる特別な値がいくつか決まっており、それ以外はすべてTrue扱いです。

まずは代表的な「Trueになるパターン」から見ていきます。

非ゼロの数値(int/float/complex)はTrue

数値型(int、float、complex)では、ゼロだけがFalse、それ以外はすべてTrueです。

Python
numbers = [1, -1, 0.1, -3.5, 1+0j, 0+1j]

for n in numbers:
    print(n, "=>", bool(n))
実行結果
1 => True
-1 => True
0.1 => True
-3.5 => True
(1+0j) => True
1j => True

これにより、たとえば次のようなコードが書けます。

Python
balance = -100

if balance:
    print("残高はちょうど0ではありません")

数値を条件式にそのまま書くと、「0かどうか」の判定として使えるため、ループ回数の残りや、残高チェックなどで簡潔に書けます

要素が1つ以上あるシーケンス(list/tuple/range)はTrue

リストやタプル、rangeなどのシーケンス型は、要素数が0ならFalse、1つ以上あればTrueになります。

Python
print(bool([]), bool([1]))
print(bool(()), bool((1, 2)))
print(bool(range(0)), bool(range(1, 5)))
実行結果
False True
False True
False True

この性質により、次のような「空かどうか」のチェックが直感的に書けます。

Python
items = []

if items:
    print("要素があります")
else:
    print("空のリストです")

要素が1つ以上あるコレクション(dict/set)はTrue

辞書(dict)や集合(set、frozenset)など「要素を持つコレクション型」は、要素数が0ならFalse、1つ以上ならTrueです。

Python
print(bool({}), bool({"a": 1}))         # dict
print(bool(set()), bool({1, 2, 3}))     # set
print(bool(frozenset()), bool(frozenset({1})))  # frozenset
実行結果
False True
False True
False True

辞書の場合は「キーが1つ以上あるかどうか」の判定として使えます。

Python
config = {}

if config:
    print("設定値が読み込まれています")
else:
    print("設定が空です")

非空の文字列(str)はTrue

文字列もほかのシーケンスと同様、空文字""だけがFalse、それ以外はすべてTrueです。

Python
print(bool(""))        # 空文字
print(bool(" "))       # スペース1つ(空ではない)
print(bool("hello"))   # 通常の文字列
実行結果
False
True
True

ここでよくある誤解は、スペースだけの文字列" "もTrueになるという点です。

長さが1以上あれば中身に関係なくTrueになるため、「空白だけ」であることを判定したい場合は別途.strip()などを組み合わせる必要があります。

Python
s = "  "

if s:
    print("空文字ではありません")  # ここは実行される

カスタムクラスのインスタンスがTrueになる条件

自前でクラスを定義した場合、そのインスタンスのTruthinessは次の優先順位で決まります。

  1. __bool__(self) が定義されていれば、その戻り値(bool)で判定
  2. 1がなければ、__len__(self) が定義されていれば、長さが0ならFalse、それ以外はTrue
  3. どちらもなければ、常にTrue

実際のコード例で確認してみます。

Python
class Box:
    def __init__(self, items=None):
        self.items = items or []

    def __len__(self):
        # 要素数でTruthinessを決めたいので、lenを定義
        return len(self.items)


class Flag:
    def __init__(self, active):
        self.active = active

    def __bool__(self):
        # activeの値をそのまま真偽値とする
        return bool(self.active)


empty_box = Box()
box_with_items = Box(["apple"])

on_flag = Flag(True)
off_flag = Flag(False)

print(bool(empty_box), bool(box_with_items))
print(bool(on_flag), bool(off_flag))
実行結果
False True
True False

このように自分のクラスに直感的な「空かどうか」「有効かどうか」の意味づけを行い、そのままif文で使えるようにしておくと、利用者にとって扱いやすいAPIを設計できます。

Falseと判定される値のパターン一覧

ここからは、Pythonが特別にFalse扱いする値を一覧で整理します。

これを押さえておけば、それ以外はすべてTrueになります。

Falseそのもの

当然ながら、Falseというbool値はFalseと判定されます。

Python
print(bool(False))
実行結果
False

Noneは常にFalse

Noneは「値がない」ことを表す特別なシングルトンで、Truthinessでは常にFalseとして扱われます。

Python
print(bool(None))
実行結果
False

ただし、NoneとFalseは同じものではありません

値の意味が違うので、後述するようにis Noneを使い分けることが重要です。

数値の0(0, 0.0, 0j)はFalse

整数、浮動小数点、複素数の値が0であればFalse、それ以外はTrueです。

Python
nums = [0, 0.0, 0j, -0.0]

for n in nums:
    print(repr(n), "=>", bool(n))
実行結果
0 => False
0.0 => False
0j => False
-0.0 => False

Pythonでは-0.0も0として扱われるため、TruthinessでもFalseになります。

空のシーケンス(list/tuple/range)はFalse

前述のとおり、長さ0のシーケンスはFalseです。

具体的には次のようなものが該当します。

  • 空リスト[]
  • 空タプル()
  • 空rangerange(0)range(5, 5)など
Python
print(bool([]), bool(()), bool(range(0)))
実行結果
False False False

空のコレクション(dict/set/frozenset)はFalse

辞書や集合系でも、要素数が0であればFalseです。

Python
print(bool({}), bool(set()), bool(frozenset()))
実行結果
False False False

空文字列(“”)はFalse

文字列では空文字""だけがFalseであり、長さ1以上の文字列はすべてTrueになります。

Python
print(bool(""))
実行結果
False

この挙動は、「入力が空かどうか」をチェックしたい場面でよく利用されます

Python
user_input = ""

if not user_input:
    print("入力が空です")

__bool__や__len__でFalseになるオブジェクト

カスタムクラスの場合、__bool__()がFalseを返す、または__len__()が0を返すと、そのインスタンスはFalse扱いになります。

Python
class AlwaysFalse:
    def __bool__(self):
        return False


class MaybeEmpty:
    def __init__(self, count):
        self.count = count

    def __len__(self):
        return self.count


af = AlwaysFalse()
empty = MaybeEmpty(0)
non_empty = MaybeEmpty(3)

print(bool(af))
print(bool(empty), bool(non_empty))
実行結果
False
False True

__bool__は必ずbool型(True/False)を返すべきであり、他の型を返すのは推奨されません。

また、__len__は整数を返す必要があります。

Pythonの真偽判定の実践例と注意点

ここまででTruthinessのルールを整理しました。

最後に、実際のコードでの使い方と、つまずきやすい注意点を解説します。

ifでよく使う真偽判定パターン

日常的なPythonコードでは、次のようなパターンがよく使われます。

シーケンスやコレクションが空かどうかの判定

「空かどうか」を知りたいとき、len()よりTruthinessを使うのがPythonicです。

Python
items = []

# 推奨
if not items:
    print("空です")

# これは冗長(ただし間違いではない)
if len(items) == 0:
    print("空です")

文字列入力の有無をチェック

ユーザー入力や設定値が「空でないか」をチェックする例です。

Python
name = input("名前を入力してください: ").strip()

if name:
    print("ようこそ,", name)
else:
    print("名前が入力されませんでした")

strip()で前後の空白を削除してからTruthiness判定をすると、「空白だけの入力」もきちんと空として扱えます。

設定値やオプションの有無を判定

辞書やNoneとの組み合わせで、オプション設定の有無を簡潔に判定できます。

Python
config = {"timeout": 10}

timeout = config.get("timeout")

if timeout:
    print("タイムアウト値:", timeout)
else:
    print("タイムアウトは未設定または0です")

ここでは0もFalse扱いになるので、「0なら未設定扱い」にしたい仕様であれば便利です。

一方で、「0も有効な値」としたいなら別の判定が必要になります(後述)。

「==」とTruthinessの違いに注意

Truthinessと比較演算(==, !=, < など)はまったく別のものです。

次のコードを比べてみます。

Python
values = [0, 1, 2, "", "hi", [], [1]]

for v in values:
    print(repr(v), "== 0 ?", v == 0, "  bool(v) ?", bool(v))
実行結果
0 == 0 ? True   bool(v) ? False
1 == 0 ? False  bool(v) ? True
2 == 0 ? False  bool(v) ? True
'' == 0 ? False bool(v) ? False
'hi' == 0 ? False bool(v) ? True
[] == 0 ? False bool(v) ? False
[1] == 0 ? False bool(v) ? True

比較演算== 0は「値が0かどうか」だけを見ていますが、Truthiness(bool(v))は「型ごとのルールに従って真偽値を決める」動作になっています。

意図が「0かどうか」であれば==を使い、「空かどうか」「存在するかどうか」など論理的な有無であればTruthinessを使うというふうに、目的に応じて使い分けることが大切です。

is Noneで判定すべきケースと使い分け

Noneを判定したいときは、必ずis None / is not Noneを使うのがPythonの基本です。

なぜif value: ではダメなのか

次のような関数を考えてみます。

Python
def find_index(lst, target):
    try:
        return lst.index(target)
    except ValueError:
        return None

idx = find_index([10, 20, 30], 10)

if idx:
    print("見つかりました:", idx)
else:
    print("見つかりませんでした")

この場合、10はリストの先頭にあるためidx = 0になります。

しかし0はFalse扱いなので、「見つかりませんでした」と誤判定されてしまいます。

ここで意図しているのは「Noneかどうか」なので、次のように書くべきです。

Python
if idx is not None:
    print("見つかりました:", idx)
else:
    print("見つかりませんでした")

is / == の違い

  • == は「値が等しいか」
  • is は「同じオブジェクトか(同一性)」

を判定します。

Noneは「ただひとつだけ存在する特別なオブジェクト」なので、同一性比較のisを使うのが慣習です。

Python
x = None

print(x is None)  # 推奨
print(x == None)  # 動くが非推奨
実行結果
True
True

Truthinessを活用したPythonicな書き方例

最後に、Truthinessをうまく活用した「Pythonらしい書き方」をいくつか紹介します。

デフォルト値の選択(or)

or演算子は左辺がTrueならそれを返し、Falseなら右辺を返します

これを利用して、簡潔にデフォルト値を指定できます。

Python
user_name = ""  # たとえば入力値

display_name = user_name or "ゲスト"
print(display_name)
実行結果
ゲスト

空文字はFalse扱いなので、空の場合は”ゲスト”が選ばれます

入力チェックと処理を1行で

Truthinessと条件付き式を組み合わせて、次のような書き方も可能です。

Python
data = [1, 2, 3]

message = "空です" if not data else f"要素数は {len(data)} です"
print(message)
実行結果
要素数は 3 です

コンテナの存在チェック

辞書で値を取得するとき、存在しないキーとNoneを区別したいかどうかによって書き方が変わります。

Python
config = {"timeout": 0, "retries": 3}

# Noneなら未設定としてデフォルトを使う例
timeout = config.get("timeout")
timeout = timeout if timeout is not None else 30
print(timeout)

# 0もFalseなので、orだけだと意図しない挙動になる例
timeout2 = config.get("timeout") or 30
print(timeout2)
実行結果
0
30

orを使うと、0や空文字も「未設定」とみなされてしまうため、「0や空文字も有効な値かどうか」で使い分ける必要があります

カスタムクラスで直感的なif判定を実現

自分のクラスに__bool____len__を定義しておくと、次のように自然なif文が書けます。

Python
class Stock:
    def __init__(self, quantity):
        self.quantity = quantity

    def __bool__(self):
        # 在庫が1以上ならTrue、0ならFalse
        return self.quantity > 0


apple_stock = Stock(10)
banana_stock = Stock(0)

if apple_stock:
    print("りんごは在庫があります")

if not banana_stock:
    print("バナナは在庫切れです")
実行結果
りんごは在庫があります
バナナは在庫切れです

このようにドメインの意味に沿ったTruthinessを設計することで、読みやすく意図が伝わるコードを書くことができます

まとめ

PythonのTruthinessは「False扱いになる少数の特別な値」と「それ以外はすべてTrue」というシンプルなルールで構成されています。

False扱いになるのは、False、None、数値の0、空のシーケンスやコレクション、空文字、そして__bool__や__len__がFalse/0を返すオブジェクトです。

これさえ押さえておけば、if文では値をそのまま書いて「空かどうか」「存在するかどうか」を自然に表現できます。

一方で、Noneを判定したいときはis Noneを使う、0も有効な値ならTruthinessに頼りすぎないなど、使い分けも重要です。

Truthinessの仕組みを理解しておくことで、よりPythonicで読みやすいコードを書けるようになります。

コーディングテクニック

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!