今日は、ブール演算子 or
の使い方について紹介します。
質問
「if name == 'うな重' or 'ビビンバ丼':」を実行してもすべてのnameに当てはまってしまいました。 なぜでしょうか?
回答
if name == 'うな重' or 'ビビンバ丼':
この部分ですが、以下のように解釈されます
if (name == 'うな重') or ('ビビンバ丼'):
(name == 'うな重')
がFalseだった場合は、orの後ろの条件を判定しますが、 ('ビビンバ丼')
は常にTrueと判定されます。
文字列での、True/Falseと判定される条件
Pythonでは、条件式にNone、 空文字、0、False、Falseになる条件式のどれかが指定されているとFalesと判定されます。
文字列の場合は、空文字( ""
)ではない 'ビビンバ丼'
は常にTrueと判定されます。
その為、どんな値が変数 name
に代入されていても条件式は True
と判定されます。
正しいコード
書き直す場合は、以下のようになります。
if name == 'うな重' or name == 'ビビンバ丼':
何故エラーにはならないの?
また、上記はコードや考え方がまちがっているのに、 エラー表示されることなく処理が実行されたことも不思議でした。
問題が意図する動きではありませんが、文法的には正しいので「実行」をすると処理が実行されます。
if 変数 in リスト:
の動作
if name in ['うな重', 'ビビンバ丼']: discount = price - 100
追記で、該当問題の模範解答の上記のコードも、 なぜこうなるのかが分かりません。
if 変数 in リスト:
とin 演算子を利用すると、リストの中に変数の値が含まれている場合はTrue, 含まれていない場合はFalseとなります。
以下例です。
name = 'うな重' if name in ['うな重', 'ビビンバ丼']: # -> True name = 'カレーライス' if name in ['うな重', 'ビビンバ丼']: # -> False
andとorの動作については、以下の記事でも解説しています。