単に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() と同義