演算子は「動作を表す記号」にすぎない
Python の演算子とは、Python に何らかの処理を指示する記号(または短いキーワード)のことです。2 つの値を足したり、比較したり、片方がもう片方を含んでいるかを調べたり──そんな役割を担います。基本的な数学記号はすでにお馴染みだと思いますが、Python にはそれ以外にも、論理・包含・同一性を扱うための演算子がいくつか用意されています。
ここからは、主要なカテゴリを順番に見ていきましょう。
算術演算子
おなじみの四則演算に加えて、Python ならではの演算子もいくつかあります。
このリストの中で、うっかり忘れがちなポイントが2つあります。
/は両辺が整数でも float を返します。10 / 2の結果は5.0です。整数で割り算したいときは//を使いましょう。%は剰余(余り)を求める演算子です。nが偶数かどうかを判定するなら、n % 2 == 0が一番スッキリ書けます。
演算子の優先順位は一般的な数学のルールと同じです。** が最も強く、次に * と /、最後に + と - の順で結合します。もちろん、カッコを使えばこの順序を上書きできます。
疑わしいときはカッコを積極的に使いましょう。コストはゼロですし、意図がはっきりします。
比較演算子
比較演算子は6種類あり、どれも真偽値(bool)を返します。
Pythonでは比較演算子を 連結 して書けます。これは他の言語ではあまり見ない、便利な書き方です。
これは「age が 18 以上かつ 65 未満」と読めますね。内部的には 18 <= age and age < 65 と同じですが、こちらの書き方のほうが数式に近くて読みやすいです。
論理演算子(and / or / not)
Python の論理演算子は記号ではなく、英単語そのままで書きます。
知っておくと得する細かい話が2つあります。
短絡評価(ショートサーキット評価) and は最初に falsy な値が出た時点で評価を止め、or は最初に truthy な値が出た時点で打ち切ります。左辺だけで結果が決まるなら、右辺は評価すらされません。この性質を使うと、エラーを安全に回避できます。
and/or は True/False ではなく、実際の値を返します。 結果を決めた側のオペランドがそのまま返ってくるイメージです。
実際のコードでは name = user_input or "anonymous" のような書き方をよく見かけますが、これはこの挙動を利用したデフォルト値設定の定番パターンです。
代入演算子
= は値を代入します。複合代入演算子は、演算と代入をまとめて行います。
複合代入は文字列 (s += "more") やリスト (lst += [4, 5]) でも使えます。速くなるわけではなく、単に書く量が減るだけです。
メンバーシップ判定: in と not in
値がコンテナの中に含まれているかを調べる in 演算子です:
in はあらゆるイテラブルで使えます。リスト、タプル、セット、文字列、辞書などなんでもOKです。ただし、大きなデータで検索する場合、リストに対する in は O(n) ですが、セットや辞書なら O(1) になります。何度もメンバーシップを判定するような場面では、この違いが効いてきます。
同一性の判定: is と is not
is は値が等しいかではなく、2つの変数が同じオブジェクト(メモリ上の同じ実体)を指しているか をチェックします。
== を使う場面がほとんどです。is が本当に活きるのは、None や True、False と比較するときくらいです:
コミュニティの慣習として、== None ではなく is None を使うのが鉄則です。is True も同様ですが、こちらを書く機会はほとんどありません。
ビット演算子(初読時は読み飛ばしてOK)
Python にはビット演算子(&、|、^、~、<<、>>)もあり、整数のビットを1つずつ操作できます。暗号処理や低レイヤのネットワーク、特定のアルゴリズムでは役立ちますが、最初に読むときは気にしなくて大丈夫です。
セイウチ演算子 (:=)
Python 3.8 で追加された := は、値の代入と返却を1つの式でまとめて行える演算子です。処理結果を変数に取り込みつつ、その場で条件判定したい場面で便利です。
セイウチ演算子を使わない場合、len(numbers) を2回呼ぶか、1行余分に書くことになります。必須の機能ではないので、重複を減らせる場面だけで使うのが吉です。
python 演算子の優先順位チートシート
実際によく使う演算子を、結合の強い順(優先度の高い順)に並べるとこうなります。
**— べき乗*、/、//、%— 乗算・除算系+、-— 加算・減算<、<=、>、>=、==、!=— 比較notandor
迷ったら素直にカッコで囲みましょう。トリッキーに書くより、読みやすさを優先したほうが結局得します。
次は制御フローへ
演算子を一通り押さえたら、あとは条件式が書けるようになります。次のページで扱うのは if / elif / else です。演算子の評価結果に応じて、プログラムが進む道を分岐させる仕組みですね。
よくある質問
Pythonの演算子にはどんな種類がありますか?
大きく分けて6種類です。算術演算子(+, -, *, /, //, %, **)、比較演算子(==, !=, <, <=, >, >=)、論理演算子(and, or, not)、代入演算子(=, +=, -= など)、メンバーシップ演算子(in, not in)、同一性演算子(is, is not)があります。
== と is はどう違うの?
== と is はどう違うの?== は「値が等しいか」を調べる演算子、is は「メモリ上でまったく同じオブジェクトを指しているか」を調べる演算子です。None・True・False はシングルトンなので is で比較するのが定番(if x is None: のように書く)。それ以外の値の比較はほぼ == でOKです。
Pythonの % 演算子は何をするもの?
% 演算子は何をするもの?数値に対しては剰余(あまり)を返す演算子です。たとえば 17 % 5 は 2 になります。文字列に使うと古いスタイルのフォーマット("hello %s" % name のような書き方)になりますが、今はほとんどの場面で f-string に置き換わっています。