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

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

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

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

Q&A

解決済

4回答

6817閲覧

if文とorと括弧の組み合わせ

MagMag

総合スコア80

Python 3.x

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

0グッド

1クリップ

投稿2020/03/18 07:40

以下リンクにあるように、if文判定でorを使うと(以下の事例1)意図しない動きになることはコードの動きとしても理解きるのですが(if 'fuga':の判定でTrueが返ってくる)、括弧でくくれば大丈夫だろうと思っても、やはり意図した動きになりません。

事例2において、どういうロジックでif文内がFalseになるのか教えていただけないでしょうか?

pythonでifの条件にorを使うときの注意

######事例1######## a = 'fugafuga' if a == 'hoge' or 'fuga': print('coffee') else: print('tea') # coffeeと出力される ######事例2######## a = 'fuga' if a == ('hoge' or 'fuga'): print('coffee') else: print('tea') # teaと出力される

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

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

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

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

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

guest

回答4

0

ベストアンサー

orはブール演算子であり、英語っぽく「a"hoge"または"fuga"のどちらかと等しい」という意味で使うことはそもそもできません。根本的な誤解はそこなのだと思います。

実際の挙動は少し込み入っていて、

x or y
x が偽なら y, そうでなければ x

組み込み型 — Python 3.8.2 ドキュメント

という動作になります。Pythonでは基本的に任意のオブジェクトの真理値を判定できるので、上の動作でいいことがわかるはずです。
(つまりxが真なら全体の真理値はxの真理値でよく、xが真でない(偽である)ときはyの真理値で全体の真理値が決まる、というorに相応しい動作になっています。そしてどちらにしても、返すのはboolではなく元のオペランドを評価した結果です)


こういうときはinで書くのが通例です。

python

1if a in {"hoge", "fuga"}:

listtupleとして書く場合もありますが、とりあえず今回はsetとしています。集合とみなすならたぶんこれが妥当でしょう。パフォーマンス面でもsetの帰属判定は多少高速に行えます。

投稿2020/03/18 08:07

編集2020/03/18 08:12
hayataka2049

総合スコア30935

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

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

MagMag

2020/03/21 00:39 編集

ありがとうございました。orの動作がいまいち整理できていなかったので、よくわかりました。また、今回の件の対応方法も含めて勉強になりました。
guest

0

python

1x = 'hoge' or 'fuga' 2print(x) # hoge

つまり
a == ('hoge' or 'fuga')
a == 'hoge'
と一緒

投稿2020/03/18 07:46

ozwk

総合スコア13551

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

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

MagMag

2020/03/21 00:37

ありがとうございました!
guest

0

「a == 'hoge' or 'fuga'」の場合、「(a == 'hoge') or 'fuga'」 と同等です。この結果は何が返ってくると期待しているのでしょうか?

同様に「a == ('hoge' or 'fuga')」は「'hoge' or 'fuga'」を評価し、それと「a」を比較していますが、「'hoge' or 'fuga'」の評価の結果、何が返ってくると期待しているのでしょうか? そしてそれと「a」との比較はやりたいことですか?

やりたいのは「(a == 'hoge') or (a == 'fuga')」ではないですか? だったらそう記述してください。

投稿2020/03/18 08:22

sage

総合スコア1240

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

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

MagMag

2020/03/21 00:34

失礼しました。
guest

0

python

1a = 'fuga' 2if a == ('hoge' or 'fuga'): 3 print('coffee') 4else: 5 print('tea')

python

1a = 'fuga' 2if a == 'hoge': 3 print('coffee') 4else: 5 print('tea')

と評価されるからです。

「('hoge' or 'fuga')」が「'hoge'」と評価されるのが、ちょっと分かりづらいところだと思います。

「or」は真偽値(True/False)ではなく、左辺値優先で先に True となった値を返します。
つまり、「bool('hoge')」と「bool('fuga')」は共に True ですが、左辺値の優先されるため、「'hoge'」が評価結果となります。

参考:Python の or と and 演算子の罠 - Qiita
https://qiita.com/keisuke-nakata/items/e0598b2c13807f102469

投稿2020/03/18 08:16

nskydiving

総合スコア6500

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

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

MagMag

2020/03/21 00:38

ありがとうございました。Qiitaのリンクも大変参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問