.. _6.7. 二項算術演算 (binary arithmetic operation): https://docs.python.org/ja/3/reference/expressions.html#binary-arithmetic-operations .. _6.5. べき乗演算 (power operator): https://docs.python.org/ja/3/reference/expressions.html#the-power-operator 1️⃣二項算術演算子としての ``*``, ``**`` ============================================================ 二項算術演算子 -------------------------------------------------- * (A)乗算 * (B)べき乗 使ったことある方〜?🙋‍♂️🙋‍♀️ 1️⃣-🅰️ ``*`` は **乗算** (掛け算) -------------------------------------------------- .. code-block:: python >>> 2 * 6 12 >>> 6 * 2 12 `6.7. 二項算術演算 (binary arithmetic operation)`_ 乗算を整理 -------------------------------------------------- * 数値どうし(前頁で見た) * 整数と *シーケンス* `6.7. 二項算術演算 (binary arithmetic operation)`_ シーケンスとは(`用語集 `__ より) ---------------------------------------------------------------------------------------------------- * リスト * 文字列 * タプル * など(※自作もできます) 整数インデクスでアクセスでき、長さを返す 整数とシーケンスの乗算 -------------------------------------------------- .. code-block:: python >>> "🐍🌟💫" * 2 '🐍🌟💫🐍🌟💫' >>> 3 * (1, 3, 5) (1, 3, 5, 1, 3, 5, 1, 3, 5) >>> [9, 8] * -2 # 負の繰り返し数では空 [] **繰り返し** 操作 1️⃣-🅱️ ``**`` は **べき乗** (パワー) -------------------------------------------------- .. code-block:: python >>> 5 ** 3 # 5 * 5 * 5 125 `6.5. べき乗演算 (power operator)`_ べき乗演算子の優先順位 -------------------------------------------------- .. code-block:: python >>> -1 ** 2 # -(1 ** 2) 左側にある単項演算子 - より ** が先 -1 >>> (-1) ** 2 1 `6.5. べき乗演算 (power operator)`_ 🔍二項算術演算子って **どう実装** されているんでしょう? ============================================================ わたし、気になります! 特殊メソッド(`用語集 `__) ---------------------------------------------------------------------------------------------------- ある型に特定の操作、例えば加算をするために Python から暗黙に呼び出されるメソッド。 **乗算・べき乗の特殊メソッド** があるんです! 特殊メソッド(`用語集 `__) ---------------------------------------------------------------------------------------------------- | この種類のメソッドは、メソッド名の最初と最後にアンダースコア 2 つがついています。 | 特殊メソッドについては `特殊メソッド名 `_ で解説されています。 補足🏃‍♂️:これらの用語は同じ意味 -------------------------------------------------- * 特殊メソッド(special method) * `マジックメソッド `_ *くだけた同義語* * ダンダーメソッド(ダンダー= **d** ouble **under** score `参照 `_) 乗算の特殊メソッド ``__mul__`` -------------------------------------------------- ``*`` (乗算)は `__mul__ `_ を呼んでいます .. code-block:: python >>> 2 * 6 12 >>> (2).__mul__(6) # カッコつけずに 2.__mul__(6) は小数とパースされてSyntaxError 12 べき乗の特殊メソッド ``__pow__`` -------------------------------------------------- ``**`` (べき乗)は `__pow__ `_ を呼んでいます .. code-block:: python >>> 5 ** 3 125 >>> (5).__pow__(3) 125 組み込み関数 `pow `_ ---------------------------------------------------------------------------------------------------- 二引数の形式 ``pow(base, exp)`` は、冪乗演算子を使った ``base**exp`` と等価です。 .. code-block:: python >>> pow(5, 3) 125 >>> (5).__pow__(3) 125 あなただけの乗算 -------------------------------------------------- * クラスを定義するときに、特殊メソッドを **オーバーライド** * ``__mul__`` をオーバーライドすれば、乗算の動きをカスタマイズできます オリジナルの乗算:文字列どうし -------------------------------------------------- 「`掛け算 `_」ができる文字列 ``CouplableStr`` .. code-block:: python >>> "ゆう" * "ぽむ" Traceback (most recent call last): File "", line 1, in TypeError: can't multiply sequence by non-int of type 'str' >>> CouplableStr("ぽむ") # doctest: +SKIP 'ぽむ' >>> CouplableStr("ゆう") * CouplableStr("ぽむ") # doctest: +SKIP 'ゆうぽむ' オリジナルの乗算:文字列どうし 実装例🏃‍♂️ -------------------------------------------------- .. literalinclude:: ../../samplecode/superstar/customize_mul.py :language: python :linenos: :lines: 6,21-24 `ソースコード `_ まとめ🥟:二項算術演算子としての ``*``, ``**`` ============================================================ .. list-table:: * - 演算 - 演算子 - **特殊メソッド** * - 乗算 - ``*`` - ``__mul__`` * - べき乗 - ``**`` - ``__pow__`` さらに知りたい方へ🏃‍♂️:『`Python実践入門`_』がオススメ ------------------------------------------------------------ * 8.2 特殊メソッド ── Pythonが暗黙的に呼び出す特別なメソッド * 特殊メソッドを学ぶのにオススメのリソース知っている方はぜひ教えてください!🙏 さら知り🏃‍♂️:過去のPyCon JPからのオススメトーク -------------------------------------------------- * 2017年 `len()関数がオブジェクトの長さを手にいれる仕組み `_ * https://youtu.be/aich6wqftkA * ``pow`` 関数が ``__pow__`` を呼び出すように、 ``len`` 関数は ``__len__`` を呼び出しているのです!(**Adapter** パターン) さら知り🏃‍♂️: `__rmul__ `_ -------------------------------------------------------------------------------------------------------------- * ``x * y`` で ``x.__mul__(y)`` が `NotImplemented `_ を返すとき、 ``y.__rmul__(x)`` が呼ばれる * ``x`` が ``__mul__`` メソッドを持っていないときも同様 `__rpow__ `_ もある さら知り🏃‍♂️: `__imul__ `_ もある -------------------------------------------------------------------------------------------------------------- * **累算算術代入** (乗算の場合は ``*=`` )の実装 特定のメソッドが定義されていない場合、その累算算術演算は通常のメソッドにフォールバックされます。