PyQオフィシャルブログ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

文字列を扱う時の or について。「『if name == 'うな重' or 'ビビンバ丼':』 がうまく動作しません」

f:id:nana_yu:20190605154055p:plain

今日は、ブール演算子 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の動作については、以下の記事でも解説しています。

blog.pyq.jp

Copyright ©2017-2018 BeProud Inc. All rights reserved.