Python 演算子の優先順位 まとめれば簡単だよ

Python ロゴ マークPython
演算子の優先順位を知りたい人

Pythonでは、演算子の優先順位ってどんな感じなのかな。

優先順位について詳しく教えて欲しい…

こちらの悩みを解決しますね。

本記事の内容

・演算子の優先順位について

・実際の演算子の処理について

・演算子の優先順位の付け方

この記事を書いている自分は、プログラミング歴4年の駆け出し以上中堅未満のエンジニアです。

過去には、AI囲碁をWebアプリ化したり、Pythonでのアプリ開発、Web制作やフロントエンドのデザインまで幅広くやってきました。

今回はそんな経験をもとに解説していこうかと。

当サイトでは、覚えるべきところを全てまとめているので、画面を撮影して何度も読み返すことをおすすめします。

それでは、解説していきます!

スポンサーリンク

演算子の優先順位について

演算子の優先順位

優先順位は上の画像の通りです。

皆さんは、この演算子の優先順位を丸暗記すれば良いわけでは無く、読む人にとっても分かりやすいプログラムを作ることを心掛けてください。

たとえば、計算をする際に

16384 + 16 * 16

16384 + (16 * 16)

この2つの式は同じ意味ですが、括弧がついているため、視覚的に「先に10 * 10を計算するんだな」とわかりやすくします。

可読性の高いコードは現場でも重宝されるので、積極的に使っていきましょう。

もちろん、先に掛け算や割り算をするべきなのに足し算や引き算を括弧でとじてしまって、本来計算したい式の優先順位を間違えてはいけません。

実際の演算子の処理について

では、pythonではどのようにしてこういった処理の優先順位を行っているのか、実際に計算してみてみましょう(今回は敢えて分かりにくい形で四則演算を行います)。

    num = 10 * 4 + 2 ** 3 / 4 > 40 - 2
    print(num)

こちらの出力結果はどのようになるでしょうか?

数値の演算を行っていたにも関わらず「True」と出力されました。

なぜこうなったかを説明します。演算子の優先順位通りに考えてみましょう。

  1. まず初めに2 ** 3を計算します。8ですね。
  2. それから左の10 * 4 で40。
  3. 右の2 ** 3(8)/ 4 は2。
  4. 40と2を足せば、左辺は42です。
  5. 右辺はそのまま、40-2で38。

ここまでが、pythonが優先順位が高いとみなし計算した四則演算の成り立ちです。

では、次にそれよりも優先順位が低い比較演算子で計算された結果をみてみましょう。

42>38で、答えは真です。

その結果、「True」という結果が出ました。

まとめると、こういうことになります。

  1. 四則演算で全体の計算をする
  2. それよりも優先順位の低い比較演算子が比較をする
  3. その結果、Trueを返す

優先順位の高い方から数え、低い方で最終的に処理が行われるという原理を考えましょう。

ちなみに、pythonではFalse(偽)以外は全てTrue(真)とみなされます。

演算子の優先順位の付け方

もう一つ、注意点としましては、四則演算に基本的な優先順位があるのと同じように、論理演算子にも明確な使い方があるということです。

論理演算子とは、以下の通り

  • or(【A or B】で、少なくとも片方が真であればTrueを返す)
  • not(【not A】で、Aが真なら偽、Aが偽なら真を返す)
  • and(【A and B】両方が真の場合Trueを返す。少なくとも片方が偽の場合Falseを返す)

となります。

たとえば

print(10 > 8 or 8 < 9)

では、or演算子で8 < 9の部分が真のため、出力結果はTrueになります。

しかし、上記の式にorの代わりにandを用いると、10 > 8も演算に含まなくてはならないため、出力結果はFalseになります。

続いてnotの場合を考えてみましょう。

print(not 9 > 8)

で、出力はFalseになるのですが、これは9 > 8が論理的に正しいのにも関わらずnotでそれを否定してしまっているため、Trueが返ってこないという理屈になります。

これらの論理演算子は、組み合わせて使うことももちろん可能です。

注意点は、間違えて違う場所に演算子を置いてしまわないように気をつけることです。

例えば、以下のコードを見てみましょう。

list = [30, 256, 125, 142, 167, 45, 401, 453]

for number in list:
    if(number < 300 and not number % 3 == 0):
        print(number)

上のコードでは

「もしlistの中身が、300未満(<300)で、尚且つ更に3で割り切れる数値(number % 3 == 0)をnotで否定する」であることを条件に抽出することにしています。

そのため、以上のコードを実行すると、以下の結果を得ます。

ちゃんと、300未満で、かつ3の倍数でない数値が出力されました。

このように表現したい場合、普通に左から右へ演算する要領でand、or、notの3種類を書いていけば良いのですが、例えば今回の例で言うとnotとandの位置を間違うとエラーが出ます。

まとめ:演算子の優先順位 まとめれば簡単だよ

優先事項

ここまで、演算子の優先順位の基本的なやり方をみてきました。

現場レベルでも、数値の計算>比較演算子>論理演算子のみで完結するパターンが多いため、まずはこれらの順番について学習すると良いでしょう。