Pythonの`truthy`と`falsy`

Pythonの`truthy`と`falsy`

この記事ではPythonのtruthyfalsyについて説明します。

YouTube Video

Pythonのtruthyfalsy

truthyfalsyの定義

Pythonでは、条件式で評価されるオブジェクトが「真」または「偽」として評価されます。truthyとは、そのオブジェクトが「真」として評価されるものを指し、falsyとは「偽」として評価されるものを指します。これらの評価は、if文やwhile文などの条件分岐でよく使用されます。また、bool()関数はあらゆるオブジェクトを受け取り、その真偽値を返します。

falsy(偽と評価されるオブジェクト)

Pythonにおいて、次のようなオブジェクトはfalsyとみなされます。

  • False

  • None

  • ゼロ値の数値

    • 例:0, 0.0
  • 空のシーケンス型(空のリストやタプル、空文字列など)

    • 例:[], (), ""
  • 空の辞書

    • 例:{}
  • 空の集合

    • 例:set()

これらのオブジェクトは、if文の条件式内で使用されると「偽」として評価されます。例えば、次のようなコードを記述できます。

1if not []:
2    print("The list is falsy.")
  • このコードでは、リスト[]が空であるため、falsyとして評価され、print文が実行されます。

truthy(真と評価されるオブジェクト)

falsyとみなされないオブジェクトは、truthyとみなされます。

  • 非ゼロ数値(整数、浮動小数点数)

    • 例:1, 3.14, -100
  • 非空のシーケンス型(リスト、タプル、文字列など)

    • 例:[1, 2, 3], (1, 2), "Hello"
  • 非空の辞書

    • 例:{"key": "value"}
  • 非空の集合

    • 例:{1, 2, 3}

truthyとみなされるオブジェクトは、if文の条件式内で使用されると「真」として評価されます。例えば、次のようなコードを記述できます。

1if [1, 2, 3]:
2    print("The list is truthy.")
  • 上記のコードでは、リスト[1, 2, 3]は空でないためtruthyとして評価され、print文が実行されます。

bool()関数を使った真偽地の評価

bool()関数を使うことでオブジェクトの真偽値を評価できます。

 1# Examples of falsy values
 2print("False is", "truthy" if bool(False) else "falsy")
 3print("0 is", "truthy" if bool(0) else "falsy")
 4print('"" is', "truthy" if bool("") else "falsy")
 5print("None is", "truthy" if bool(None) else "falsy")
 6print("[] is", "truthy" if bool([]) else "falsy")
 7
 8# Examples of truthy values
 9print("1 is", "truthy" if bool(1) else "falsy")
10print('"hello" is', "truthy" if bool("hello") else "falsy")
11print('" " (space) is', "truthy" if bool(" ") else "falsy")
12print('"0" is', "truthy" if bool("0") else "falsy")
  • このコードは、さまざまな値の真偽値がどのように評価されるかを示しています。例えば、数値の0や空文字列はFalseとみなされますが、スペースや文字列の"0"Trueとみなされます。

truthyfalsyの活用

truthyfalsyを活用することで、コードが簡潔で直感的に書けます。特に、if文での評価を短くするために、明示的に比較しなくてもよい場合が多くあります。例えば、次の2つのコードは同じような動作をしますが、最初のコードがより簡潔です。

1my_list = [1]
2
3# Explicit comparison
4if my_list != []:
5    print("The list is not empty.")
6
7# Using truthy/falsy
8if my_list:
9    print("The list is not empty.")

上記の例では、my_listが空リストでない限りtruthyとして評価されるため、明示的に比較しなくても良いことが分かります。

truthyfalsyを利用した設計

truthyfalsyの概念をうまく活用すると、コードの可読性と効率を高めることができます。特に、デフォルト値の設定や、変数の有効性チェック、入力の検証などでよく利用されます。例えば、Noneや空のリストが引数として渡されることを予期する場合、次のようなコードを書くことができます。

1def process_data(data=None):
2    data = data or []
3    print(data)
4
5process_data()  # An empty list is used by default.
  • このコードでは、dataNoneである場合に空リスト[]をデフォルト値として設定します。このように、truthyfalsyを駆使することで、デフォルト値を簡潔に設定できます。

意図しない挙動を避けるための注意点

ただし、truthyfalsyを活用したコードは簡潔で便利な一方で、意図しない挙動を引き起こす可能性がある点にも注意が必要です。たとえば、このコードでは、dataNone の場合だけでなく、空文字列や0など Falseと評価されるすべての値 がデフォルト値の空リスト[]に置き換えられます。そのため、「値が None のときだけ初期化したい」といった より厳密な条件 が求められる場合には、value is None:のように 明示的な条件文 を使用することが推奨されます。状況に応じて、簡潔さと厳密さのバランスを意識した設計が重要です。

1def process_data(data=None):
2    if data is None:
3        data = []
4    print(data)
5
6process_data()   # An empty list is used by default.
7process_data(0)  # 0 is printed because it's not None.
  • このコードでは、dataNoneの場合だけ空リストに初期化し、0などの他の偽値はそのまま扱っています。

カスタムオブジェクトでの真偽値の制御

自作のクラスでも、__bool__() または __len__() を定義することで、インスタンスの真偽値を制御できます。

 1class MyContainer:
 2    def __init__(self, items):
 3        self.items = items
 4
 5    def __len__(self):
 6        return len(self.items)
 7
 8box = MyContainer([])
 9print(bool(box))  # False
10
11box.items.append("item")
12print(bool(box))  # True
  • このコードでは、__len__() メソッドによって、コンテナが空のときは False、要素があるときは True と評価されます。

結論

Pythonにおけるtruthyfalsyの概念は、条件式を簡潔に記述し、コードをより直感的にするために非常に重要です。これらを理解し、適切に活用することで、コードの可読性と効率を大いに向上させることができます。

YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。

YouTube Video