Pythonの`truthy`と`falsy`
この記事ではPythonのtruthy
とfalsy
について説明します。
YouTube Video
Pythonのtruthy
とfalsy
truthy
とfalsy
の定義
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
とみなされます。
truthy
とfalsy
の活用
truthy
とfalsy
を活用することで、コードが簡潔で直感的に書けます。特に、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
として評価されるため、明示的に比較しなくても良いことが分かります。
truthy
とfalsy
を利用した設計
truthy
とfalsy
の概念をうまく活用すると、コードの可読性と効率を高めることができます。特に、デフォルト値の設定や、変数の有効性チェック、入力の検証などでよく利用されます。例えば、None
や空のリストが引数として渡されることを予期する場合、次のようなコードを書くことができます。
1def process_data(data=None):
2 data = data or []
3 print(data)
4
5process_data() # An empty list is used by default.
- このコードでは、
data
がNone
である場合に空リスト[]
をデフォルト値として設定します。このように、truthy
とfalsy
を駆使することで、デフォルト値を簡潔に設定できます。
意図しない挙動を避けるための注意点
ただし、truthy
とfalsy
を活用したコードは簡潔で便利な一方で、意図しない挙動を引き起こす可能性がある点にも注意が必要です。たとえば、このコードでは、data
が None
の場合だけでなく、空文字列や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.
- このコードでは、
data
がNone
の場合だけ空リストに初期化し、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におけるtruthy
とfalsy
の概念は、条件式を簡潔に記述し、コードをより直感的にするために非常に重要です。これらを理解し、適切に活用することで、コードの可読性と効率を大いに向上させることができます。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。