【Python】演算子の優先順位

python_logo

今回は、Pythonの演算子の優先順位についてまとめたいと思います。

演算子について

  1. 演算子の優先順位
  2. 注意点・Tips

演算子の優先順位

とりあえず、公式サイトからPython3.7時点では以下のようになっています。

演算子 説明
lambdaラムダ式
if/else条件式
orブール演算 OR
andブール演算 AND
not xブール演算 NOT
in, not in, is, is not, <, <=, >, >=, !=, ==所属や同等、同一性のテストなどの比較
|ビット単位 OR
^ビット単位 XOR
&ビット単位 AND
<<, >>シフト演算
+, –加算および減算
*, @, /, //, %乗算、行列乗算、除算、切り捨て除算、剰余
+x, -x, ~x正数、負数、ビット単位 NOT
**べき乗
await xAwait 式
x[i], x[a:b], func(arg…), obj.attr添字指定、スライス操作、呼び出し、属性参照
(式), [式…], {key: value…}, {式…}式結合またはタプル表示、リスト表示、辞書表示、集合表示

参考: 6. 式 (expression) — Python 3.7.4rc1 ドキュメント

注意点・Tips

Pythonは常に進化しています。従って、この優先順位にも追加されたり、削除されたりしています。

私の知っている限りをここに書いていきます。

//の2.2追加

2.2から小数を切り捨てて整数とする「//」が追加されました。

ただし、Python2では「/」は切り捨てでした。これはPythonの初期からある仕様で、議論の的になっていたようです。

それをなくすために段階的に導入されていった経緯があります。いきなり、整数を返すのではなく、浮動小数点数を返すようになったら、動かなくなるコードが多かったのです。

Python3で//は切り捨ての整数を返すようになり、/は浮動小数点数表現で可能な限り値を表現してくれます。

詳しくは以下をご覧ください。

PEP 238 – 除算演算子を変更していく

https://www.python.org/dev/peps/pep-0238/

<>のPython3で削除

同じ意味合いのものとして!=があります。

<>はデータベースで使うキーワードですね。

おそらく、同じ意味のキーワードがあると、使う人によって実装が異なってしまい、可読性が下がるのじゃないでしょうか。

Pythonの思想的にNGだったのでしょうね。

`・・・`のPython3で削除

これはインタープリタ内のオブジェクトを出力します。

対話型インタプリタで直接オブジェクトだけ入力したときに値が返ってきますよね?あれです。内部で__ repr __にアクセスしています。

これも<>と同じような理由だと思います。

repr関数があるので、それを使いましょう。

醜いより美しいが良いですね。

await文をPython3.5から追加

これは時代の流れを感じます。

非同期処理を言語使用として組み込み始めました。

@演算子の追加3.5

これは、機械学習のほうの流れを汲んでいるのでしょうか。

行列の乗算にたいして行われます。

ただし、ビルトインの型では実装されていません。

使うときは__matmul__を実装すればよいみたいです。

まとめ

いかがだったでしょうか?

おそらく、私が知らないものや漏れているものもあると思いますので順次追加していきたいと思います。

ただ、処理順序は覚えなくて大丈夫です。その都度確認すればいいですし、なにより括弧つければいいだけですので・・・

以上になります。

それではみなさんのPythonライフがよりよくなるように祈ってます!