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 と書くことで、0 は None ではない(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年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能④
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能③
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能②
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能①