9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

a = (1 and 2 or 3 and 4)を説明できますか?

Posted at

目的

pythonのand/or演算子を掘り下げておきたい。

題材

and/or演算子が複数含まれている文。a = 1 and 2 or 3 and 4
タイトルでは()をつけたがなくても一緒。※括る場所を変えると結果は変わる。
ポイントは右辺の演算結果は何者か?なぜそうなるか。

先走って結論

a = 2 と同等です。

ポイント

  • TrueやFalse以外の変数だってand/or演算子の処理ができる。
  • and/or演算子は結果としてTrueやFalseを返さない。(演算子の左右にそれ自体がいれば話は別)
  • and/or演算子は左右のどちらかを選ぶ処理。
  • 同時に and/or (またはnot)が含まれるとき、優先順位がある。

解説

and/or演算子

if money >= 1000 or points >= 1200
こんな感じの条件分岐はよく見るでしょう。現金1000以上さもなくばポイント1200以上の場合は、って意図です。
現金なくてもお買い物ができそうなケースに使えるif文です。

次のケースでは、財布を忘れずに持ってきていれば現金が1000以上かという判定を行います。
wallet and money >= 1000
ここまでは文章でスルッと理解できると思います。

それでは、現実的ではないケースですが。財布を所持していなかったら?

pythonでは、wallet and money >= 1000の答えとしてwalletが残ります。
結果、「財布を持ってないよ」という情報のみが残ることになります。

ということで、pythonのand/or演算子の挙動ですが、

  • or演算子は左がTruthyの変数なら左を、さもなくば右をそのまま返す
  • and演算子は左がTruthyの変数なら右を、一方でFalsyなら左をそのまま返す
    となっています。直感的ではなくなってくる部分ですがこれがルールです。

or演算子が日本語っぽい理解もできるんですが、and演算子はそういう理解がしづらいです印象です。

補足ですが、
TruthyとはFalsyではない変数と覚えた方がいいです。
中身のある変数とか、Trueになれる変数とか、bool関数を通してTrueになるやつらとか言われます。
Falsyとは、数値なら0、文字列型なら文字数0の空文字、配列や辞書などでは要素数0の空の変数が該当します。
中身の存在しない変数などと言われることもあります。

複数のand/or演算子

さてタイトルの1 and 2 or 3 and 4ですが、先程のルールだけで愚直に左から順に読むと、
1 and 2 →2
2 or 3 →2
2 and 4 →4
という演算が行われそうですが、python上で実行してみると結果は2です。
【理由・大事なルール】andとorが並列されているときは andの処理が優先。(notがあればさらにnotが優先)
※カッコで括ることで演算の順番を変更することは可能です。

ということで、正しい処理の順番は
1 and 2 →2
3 and 4 →4
2 or 4 →2
となっています。

最後に

ここが初〜中級者から先に進む時のpython引っ掛かりポイントとして有名な点だと思います。
間違ったこと書いてる記事も複数見かけたので正しい知識を広めたいとの思いも込めて記事書きました。

9
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?