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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

3回答

835閲覧

if文にカッコをつけると結果が異なる

fuku-chann

総合スコア82

Python 3.x

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2023/04/21 09:38

編集2023/04/22 13:23

下記にif文が2つありますが、カッコの有無で真偽が異なります。
chatgptに質問しましたが、納得のいく回答が得られませんでしたので、質問いたしました。
ご存知の方おられましたら、ご教示お願いいたします。

Python

1menu = "abd" 2if "a" in menu or "b" in menu or "c" in menu and "d" not in menu: 3 print(location(), "true") 4else: 5 print(location(), "false") 6 7menu = "abd" 8if ("a" in menu or "b" in menu or "c" in menu) and "d" not in menu: 9 print(location(), "true") 10else: 11 print(location(), "false")

2023.04.21 18:35 /Users/test.py:123 [1] <module> true
2023.04.21 18:35 /Users/test.py:131 [2] <module> false

以下ChatGPTの回答です。
and演算子の方がor演算子よりも優先順位が高いため、and演算子の評価が先に行われます。

  1. 括弧で囲まれた部分
  2. not
  3. and
  4. or

したがって、以下のように評価されます。

  1. "a" in menu を評価する。
  2. "b" in menu を評価する。
  3. "c" in menu を評価する。
  4. 3と"d" not in menuをand演算子で評価する。

1〜4の結果をor演算子でつなげた結果を求める。
つまり、"4" not in menuの評価は3とand演算子でまとめて行われます。
Pythonではor演算子は左から右に評価され、左辺がTrueの場合は右辺の評価を行いません。

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

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

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

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

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

maisumakun

2023/04/21 10:03

> chatgptに質問しましたが、納得のいく回答が得られませんでしたので この回答をご提示ください。同じ回答となる可能性もあります。
fuku-chann

2023/04/21 10:13

and演算子の方がor演算子よりも優先順位が高いため、and演算子の評価が先に行われます。 1. 括弧で囲まれた部分 2. not 3. and 4. or したがって、以下のように評価されます。 1. "a" in menu を評価する。 2. "b" in menu を評価する。 3. "c" in menu を評価する。 4. 3と"d" not in menuをand演算子で評価する。 1〜4の結果をor演算子でつなげた結果を求める。 つまり、"4" not in menuの評価は3とand演算子でまとめて行われます。 Pythonではor演算子は左から右に評価され、左辺がTrueの場合は右辺の評価を行いません。
fuku-chann

2023/04/21 10:14

上記の説明から、and "d" not in menuが4番目に計算されている、というところが理解できません。
TakaiY

2023/04/21 11:03

ここは、質問に対するコメントを書くところですので、コメントへの回答は質問を編集して追記/変更したほうがいいですよ。
fuku-chann

2023/04/21 11:15

質問文修正いたしました。
guest

回答3

0

上記の説明から、and "d" not in menuが4番目に計算されている、というところが理解できません。

カッコを付けない場合、"a" in menu or "b" in menu or ("c" in menu and "d" not in menu)と解釈されている、ということです。

投稿2023/04/21 11:17

maisumakun

総合スコア145121

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

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

fuku-chann

2023/04/21 11:25

ご回答ありがとうございます。 カッコをつけない場合の正しい優先順位は、以下になりますでしょうか? 1. "d" not in menuを評価する。 2. "c" in menu を評価する。 3. "a" in menu を評価する。 4. "b" in menu を評価する。
maisumakun

2023/04/21 14:38

他の方のコメントにもありますが、「評価の順序」と「結合の優先順位」は別物です。
guest

0

ベストアンサー

1 + 2 + 4 * 0(1 + 2 + 4) * 0 の結果が変わることは理解できますか?


1 + 2 + 4 * 0 は、かけ算が結合の優先度が高いので 1 + 2 + (4 * 0) と解釈されます。

評価順は

  1. 1 + 2 → 3
  2. 4 * 0 → 0
  3. 3 * 0 → 0

で結果は0です。

(1 + 2 + 4) * 0 の評価順は

  1. 1 + 2 → 3
  2. 3 + 4 → 7
  3. 7 * 0 → 0

です。

以上を踏まえて質問の式を見てください。
これでわかれば今は十分だと思います。


補遺

結合の優先度 と 評価の順番 を混ぜて考えては駄目です。
括弧は、結合の優先度を変えるのであって、評価の順番を変えたりはしません

"a" in menu or "b" in menu or "c" in menu and "d" not in menu の評価順は

  1. "a" in menu を評価して True
  2. True or "b" in menu は左側がTrueなので "b" in menu評価しないで True
  3. True or "c" in menu and "d" not in menu はorの左側がTrueなので"c" in menu and "d" not in menu評価しないで True

です。

("a" in menu or "b" in menu or "c" in menu) and "d" not in menu の評価順は、

  1. "a" in menu を評価して True
  2. True or "b" in menu は左側がTrueなので "b" in menu評価しないで True
  3. True or "c" in menu は左側がTrueなので "c" in menu評価しないで True
  4. "d" not in menuを評価して False
  5. True and False を評価してFalse

です。

https://docs.python.org/ja/3/reference/expressions.html#boolean-operations

投稿2023/04/21 11:48

編集2023/04/21 15:20
quickquip

総合スコア11029

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

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

fuku-chann

2023/04/22 04:23

詳細にご説明いただき大変感謝いたします。 僭越ながらエンジニアとして一つレベルが上がりました。 大変ありがとうございました。
guest

0

pythonの演算子の順序はドキュメントの以下の場所にあります。
https://docs.python.org/3/reference/expressions.html?highlight=operator%20priority#operator-precedence

表現がどのように評価されるのかは、優先順位の差があるところを()でくくるとわかりやすいです。算術演算と同じです。

はじめの表現をくくってみましょう。

python

1"a" in menu or "b" in menu or "c" in menu and "d" not in menu

まずは、and/orよりinの方が強いので、inとnot inはくくれます。

python

1 ("a" in menu) or ("b" in menu) or ("c" in menu) and ("d" not in menu)

次の順位を見ると、()の間は or, or, and となっていて、and の方が強いので、and をくくることになります。

python

1 ("a" in menu) or ("b" in menu) or (("c" in menu) and ("d" not in menu))

あとは同じ順序のものしか並んでいないので、かっこの中、左、の順に評価します。

さて、これと、2番目の式を比べてみましょう。

python

1(("a" in menu) or ("b" in menu) or ("c" in menu)) and ("d" not in menu)

大きな違いは、最初の式では同列に並んでいた、or と and が、orの並びを()でくくられていることで分離され、順序が変っているところです。
順序が変れば評価の結果も変ります。

投稿2023/04/21 11:22

TakaiY

総合スコア12657

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

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

fuku-chann

2023/04/21 11:36

ご回答ありがとうございます。 理解できてきました。 and と orを一文にする場合、複雑になる感じですね。 慣れれば問題ないレベルかもですが、通常どのように運用されているのでしょうか?
TakaiY

2023/04/21 11:51 編集

- 誤解などを避けるために不要であってもかっこでくくる、 - 長くなるようであれば複数に分け、出た部分判定に意図のある名前を付ける。 「成人」「肥満気味」など。 などはしますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問