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

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

ただいまの
回答率

87.61%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,360

score 15

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!")

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+6

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/08 14:21 編集

    @Aphnaidel さん
    > 字面は分かるのですが、まだ真意が理解できていないと思います。もしよろしければ補足説明していただけませんでしょうか。

    例えば if a or b: は、次のように書いているのと同じだと言うことです。
    cond = a or b
    if cond:

    これは and や or に限った話では無く、例えば比較演算子を判定に用いた場合も同様です。

    キャンセル

  • 2019/02/08 23: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と同じだから実質使う場面はないという理解で合っていますかね・・・?

    キャンセル

  • 2019/02/08 23:15 編集

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

    キャンセル

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る