Pythonの「True」と「False」だけじゃない?TruthyとFalsyを学んでコードをスッキリさせよう!

こんにちは。ゆうせいです。

新人エンジニアのみなさん、Pythonの学習は順調ですか?

if文を使った条件分岐は、もうすっかりお手の物かもしれませんね。

if score > 80: のように、比較演算子(>== など)を使って「True(真)」か「False(偽)」を判定するのは、基本中の基本です。

でも、こんなコードを見たことはありませんか?

my_list = [1, 2, 3]
if my_list:
    print("リストには中身があります")

my_list を何かと比較しているわけでもないのに、if文の条件として使われています。

「え、これってどういうこと?」

そう思ったあなた、素晴らしい疑問です!

実はPythonは、True と False という値そのもの以外にも、「Trueっぽいもの」と「Falseっぽいもの」を賢く見分けてくれるんです。

今回は、この「Trueっぽい」「Falseっぽい」という概念、専門用語でいうところの「Truthy(トゥルーシー)」と「Falsy(ファルシー)」について、一緒に学んでいきましょう!

Falseと判定される「Falsy」な仲間たち

まずは「Falseっぽいもの」、つまり「Falsy(ファルシー)」から見ていきましょう。

Falsyとは、Pythonが条件分岐などで「False(偽)」として扱う値のことです。

False そのものではなくても、False とみなされる、という意味ですね。

例えるなら、「財布が空っぽ」な状態です。

中にお金(True)がまったく入っていない「無」や「空(から)」の状態が、Falsyなイメージだと捉えてみてください。

具体的に、PythonでFalsyとして扱われる値は以下の通りです。

  • False
    • これはもちろん、大元の「False」です。
  • None
    • 「何もない」ということを示す特別な値です。中身がない、空っぽの代表ですね。
  • 数値の 0
    • 整数の 0
    • 浮動小数点数の 0.0
    • (少し難しいですが)複素数の 0j など。
    • とにかく「ゼロ」はFalsyです。「何もない」イメージと一致しますね!
  • 空のシーケンスやコレクション
    • 空の文字列: ""''
    • 空のリスト: []
    • 空のタプル: ()
    • 空の辞書: {}
    • 空のセット: set(){} は空の辞書になってしまうので、こう書きます)

これらはすべて、「中身が入っていない」状態です。

空っぽの箱や、誰もいない部屋を想像してみてください。それがFalsyです。

Trueと判定される「Truthy」な仲間たち

では、次に「Trueっぽいもの」、つまり「Truthy(トゥルーシー)」です。

これは簡単ですよ!

Truthyとは、先ほど挙げたFalsy以外のすべての値のことです。

そう、Falsyでなければ、全部Truthyなんです。

Pythonが「True(真)」として扱う値ですね。

先ほどの財布の例えで言えば、「財布に1円でも入っている」状態です。

中身が少しでもあれば、「有(ゆう)」であり「真」とみなされる、というわけです。

具体的には、以下のようなものがTruthyになります。

  • True
    • 大元の「True」ですね。
  • 0 以外の数値
    • 1, -10, 3.14 など、ゼロでなければOKです。
  • 中身のある文字列、リスト、タプル、辞書、セット
    • "hello"
    • [1, 2]
    • {"name": "Yusei"}
    • {1, 2, 3}
  • その他、ほとんどのオブジェクト

Falsyな値を「False, None, 0, 空っぽのコンテナ」と覚えてしまえば、それ以外はすべてTruthyだと判断できますね!

TruthyとFalsyを知っていると、どんないいことが?

このTruthy/Falsyという概念、なぜ知っておく必要があるのでしょうか?

それは、知っているとコードがとてもシンプルに、スッキリと書けるようになるからです!

例1: リストに中身があるかチェック

Falsyを知らないと、リストの長さを調べて判断するかもしれません。

my_list = [1, 2, 3]
if len(my_list) > 0:
    print("リストには中身があります")

len() で長さを取得し、それが 0 より大きいかを見ていますね。

もちろん間違いではありませんが、Falsyを知っていると、こう書けます。

my_list = [1, 2, 3]
if my_list:
    print("リストには中身があります")

どうでしょう? my_list が空([])ならFalsy、中身があればTruthyです。

len() を使わなくても、if my_list: と書くだけで「my_list に中身があれば」という意味になるんです!

例2: 変数に値が設定されているか(Noneでないか)チェック

変数に値が入っているかもしれないし、None が入っているかもしれない。

そんな時、None でないことだけを確認したい場合があります。

my_var = "Hello" # もしかしたら None かも
if my_var is not None:
    print(f"値は {my_var} です")

これも、Falsyを使えばこうなります。

my_var = "Hello" # もしかしたら None かも
if my_var:
    print(f"値は {my_var} です")

my_var が None ならFalsy、"Hello" のような文字列ならTruthyです。

とてもスッキリしましたね!

たった一つの注意点

便利なTruthy/Falsyですが、一つだけ落とし穴があります。

それは、「0(ゼロ)」もFalsyとして扱われる点です。

例えば、ユーザーからの入力を処理するプログラムを考えてみましょう。

ユーザーが 0 と入力した場合、それは「入力がない」こととは違いますよね?

0 という立派な値が入力されています。

しかし、Falsyを使ったチェック方法だと、意図しない動きをすることがあります。

悪い例:

user_input = 0 # ユーザーが 0 と入力したとします

if user_input: # 0 は Falsy なので、この条件は False になります
    print(f"入力された値は {user_input} です")
else:
    print("入力がありません") # こっちが実行されてしまう!

困りましたね。「入力がありません」と表示されてしまいました。

0 という値を「ない」ものとして扱ってしまったのです。

こういう場合は、「0 という値」と「None(本当に入力がない)」を明確に区別しなければなりません。

良い例:

user_input = 0 # ユーザーが 0 と入力

if user_input is not None: # None かどうかをはっきりと確認!
    print(f"入力された値は {user_input} です")
else:
    print("入力がありません")

is not None と書くことで、0None ではない(Truthyとは関係なく、比較としてTrue)と判定され、正しく動作します。

if my_var: のように書くのは、None や「空のコンテナ」をチェックしたいときに使うのが安全です。

「0」という値を明確に扱いたい場合は、if my_var is not None: や if my_var == 0: のように、はっきりと比較する癖をつけましょう!

まとめと今後の学習指針

お疲れ様でした!

今回は、Pythonが持つ「Truthy(Trueっぽいもの)」と「Falsy(Falseっぽいもの)」という便利な仕組みについて学びました。

  • Falsyな値: False, None, 0, 空のコンテナ("", [], {}, (), set()
  • Truthyな値: Falsy以外のすべて

これを覚えておけば、if my_list: のようにシンプルで読みやすいコードが書けるようになります。

ただし、0 もFalsyとして扱われる点には注意が必要でしたね。

0 と None を区別したいときは、if my_var is not None: のようにはっきり書きましょう。

今後は、if 文を書くときに、「この変数はFalsyになる可能性があるかな?」「0 をFalsyとして扱っても問題ないかな?」と、一度立ち止まって考える習慣をつけてみてください。

ちなみに、将来オブジェクト指向を学ぶと、自分で作ったクラス(設計図)から生まれるオブジェクトが、TruthyになるかFalsyになるかを制御することもできます。

(__bool__ メソッドや __len__ メソッドというものを使います)

興味が湧いたら、ぜひ調べてみてください!

TruthyとFalsyを使いこなして、より「Pythonらしい」コードを書けるエンジニアを目指しましょう!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。