質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

365閲覧

文字列の一致で ==" " or " "は使えないのですか?

Aphnaidel

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/02/07 17:08

Python超初心者です。
あるサイトで練習していたのですが、

文字列が与えられるので、これが "candy" か "chocolate" であれば "Thanks!"、その他の場合は "No!" を出力してください。

という問題で

line_1 = input() if line_1 == "chocolate" or "candy": print("Thanks!") else: print("No!")

だと入力値が何であろうと分岐せず、ifに吸われてThanks!が出力されてしまうのですが、

line_1 = input() if line_1 == "chocolate": print("Thanks!") elif line_1 == "candy": print("Thanks!") else: print("No!")

だとうまく分岐しました。

なぜ前者はうまくいかないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

line_1 == "chocolate" or "candy" は (line_1 == "chocolate") or "candy" の順で評価されます。
つまり、『line_1 == "chocolate"が真 あるいは "candy"が真』という条件です。

Pythonにおいては、空でない文字列は常に真であると見做されます。
その上では、先の条件式は『line_1 == "chocolate"が真 あるいは 真』、つまり恒真式です。


line_1 in ("chocolate", "candy") という条件を使うと幸せになれると思います。

余談

『それなら line_1 == ("chocolate" or "candy") と書けば良いでは無いか』と思う方もいるでしょう。
しかし、結局は line_1 == "chocolate" という条件と同じになっちゃうんですよね。

andやorは計算をするだけ、if文は計算結果を利用するだけということは案外見落とされがちです。

投稿2019/02/07 17:13

編集2019/02/07 17:18
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Aphnaidel

2019/02/07 17:42

ほお~なるほど・・・!『line_1 == "chocolate"が真 あるいは "candy"が真』という条件になっていたのですね。「なぜ間違っているのか」を理解できてとてもスッキリしました、ありがとうございます。 in ("","")を使って幸せになりました。 しかしすみません、なぜ line_1 == ("chocolate" or "candy")が↑と同じ条件として取られてしまうのか分かりません。自分でも試してみましたが確かに今度は入力が”candy"なのに出力は"No!"でした。 『andやorは計算をするだけ、if文は計算結果を利用するだけ』 >字面は分かるのですが、まだ真意が理解できていないと思います。もしよろしければ補足説明していただけませんでしょうか。
Orlofsky

2019/02/07 23:42

line_1 == ("chocolate" or "candy") は line_1 == "chocolate" or line_1 == "candy" と記述したのと同じ、って決まり(文法ってもの)です。 コンピューター言語はシンプルに同じものを何度も書かないで済むように文法が決められています。
ozwk

2019/02/08 00:01

line_1 == ("chocolate" or "candy") ()がついているので、()内を先に計算する。 "chocolate" or "candy"の計算結果は"chocolate" したがってline_1 == ("chocolate" or "candy")は line_1 == "chocolate"と同等 https://docs.python.org/ja/3/reference/expressions.html#boolean-operations > 式 x or y は、まず x を評価します; x が真なら x の値を返します; それ以外の場合には、 y の値を評価し、その結果を返します。
LouiS0616

2019/02/08 05:19

@Orlofsky さん その文法は存在しないですね... あるいは私が知らないだけで、他言語には当たり前のようにある文法なのでしょうか? @ozwk さん コメント感謝します。
LouiS0616

2019/02/08 05:27 編集

@Aphnaidel さん > 字面は分かるのですが、まだ真意が理解できていないと思います。もしよろしければ補足説明していただけませんでしょうか。 例えば if a or b: は、次のように書いているのと同じだと言うことです。 cond = a or b if cond: これは and や or に限った話では無く、例えば比較演算子を判定に用いた場合も同様です。
Aphnaidel

2019/02/08 14:09

@ozwk さん @LouiS0616さん あ~!そういうことか!ありがとうございます。 if x = A or B の場合は、 if 'x = A' or 'B' となり、 if x = (A or B) の場合は、 if x = Aの結果を返すだけでif x = Bには戻らないんですね? ということは、== (A or B)の形って== Aと同じだから実質使う場面はないという理解で合っていますかね・・・?
LouiS0616

2019/02/08 14:15 編集

確かにAが真値なら、== A と同じですね。対してAが偽値であるときは == B と同じです。 使うとしたら、例えば『AあるいはBのどちらか一方に真値である有効な値が入っていて、その有効な値が特定の文字列であるか判定したい』という状況ならば == (A or B) と書くことはあり得ます。
guest

0

A or Bは前から見ていって、Aが真だったらAの値、Aが偽だったらBの値という意味になります。

よってline_1 == "chocolate" or "candy"line_1 == "chocolate"が真だったらその値(True)、line_1 == "chocolate"が偽だったら"candy"の値という意味になります。

そして"candy"は空文字列ではないので常に真と評価され、最終的にいつもThanks!と表示される動きになります。

投稿2019/02/08 00:28

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問から少し外れますが、この文脈ではinという演算子が使えますよ。

python

1if line_1 in ("chocolate", "candy"): 2 print("Thanks!")

投稿2019/02/07 19:32

tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問