単にTrueかFalseを返す演算子ではない
Pythonの or は「または」の意味だと說明されることがあります。
x = 10
# x は 10 または 20
if x == 10 or x == 20:
print("xは10か20です")
# 実行結果:xは10か20です
しかしこのコードの実行結果を見ると、 or は単なる「または」ではないことがわかります。
a = False b = 123 print(a or b) # 実行結果: 123 # Trueではない
じゃあ何なのか
公式ドキュメントには下記の說明があります。
式
docs.python.org – 6. 式 (expression)x or yは、まず x を評価します; x が真なら x の値を返します; それ以外の場合には、 y を評価した結果値を返します。
オブジェクトを返す演算子
or は両端の値のうち、 最初にTrueと評価される値 を返します。
true_value_1 = 100 true_value_2 = 200 print(true_value_1 or true_value_2) # 実行結果: 100 # true_value_1 or true_value_2 の中で、 # true_value_1 が最初にTrueと評価される値である → 100
両方がFalseと評されるなら、右側の値を返します。
false_value_1 = False false_value_2 = 0 print(false_value_1 or false_value_2) # 実行結果: 0 # false_value_1 or false_value_2 の中で、Trueと評価される値はなかった。 # false_value_2 が右側の値である → 0
※より正確には、返されるのは「値や式の評価結果」です。
つまりどういうことか
or が返すのは or の両端の値のどちらかです。どちらが返されるかは、その両端の値がTrueとFalseどちらに評価されるかによって決まります。
Pythonの or はJavaなどの言語と異なり、真偽値(True, False)しか受け取れない演算子ではありません。あらゆる値をオペランドに(つまりorの両側に)持つことができます。
つまり先に登場したif文は厳密に言うと下記の流れをたどっているということです。
x = 10
if x == 10 or x == 20:
# ↓
# if True or False: # or の両端の式がまず計算される
# ↓
# if True: # orの左側の値がTrue。よってorは左側の値のTrueを返す
print("xは10か20です")
# 実行結果: xは10か20です
両方ともFalseとなる場合は下記のとおりです。
x = 100000
if x == 10 or x == 20:
# ↓
# if False or False: # or の両端の式がまず計算される
# ↓
# if False: # orの両端がFalse。よってorは右側のFalseを返す
print("xは10か20です")
# 実行結果: (何も出力されない)
どう役立つのか
関数の引数のデフォルト値
関数の引数に偽と評価される値 (None 0 "" など)が渡された場合のデフォルト値を設定できます。
def greet(name=None):
name = name or "Guest"
print(f"Hello, {name}!")
greet() # 出力: Hello, Guest!
greet("Alice") # 出力: Hello, Alice!
PHPの言語でサポートされているNull合体演算子の代わりのように使えるということです。
hoge = None # if hoge is None: # hoge = "Hello World!" # ↑↓同じ実行結果 hoge = hoge or "Hello World!" print(hoge) # PHPのNull合体演算子に近い # $hoge = $hoge ?? "Hello World!"
例えばどんなところで役立っているのか
Django(PythonでWebアプリケーションを作るときに使われる、代表的なフレームワーク)でFormのオブジェクトを生成する際は下記のように書くのがお約束です。
form = Form(request.POST or None)
request.POST or None は、 request.POST に値が入っていれば下記のように評価され、
# request.POST に値が入っている場合(Trueと評価される場合) form = Form(request.POST)
request.POST がFalseと評価される(値が無いなど)場合は下記のように評価されるということです。
# request.POST がFalseと評価される場合(値が入っていないなど) form = Form(None) # Form() と同義