質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

3回答

885閲覧

1 + 1. の仕組み

Paalon

総合スコア266

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2グッド

0クリップ

投稿2021/10/26 05:22

Python で 1 + 1. はどうやって計算されるのですか?

py

11 + 1 # 2 21 + 1. # 2.0 3(1).__add__(1) # 2 4(1).__add__(1.) # NotImplemented

となりました。x + yx.__add__(y) だと思っていたのですが、そうではないのでしょうか?

attakei, LouiS0616👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

  • x + yx.__add__(y) だと思っていたのですが、そうではないのでしょうか?

違います。

そのようにインプリメントしてあると、後で新しい数型を追加した場合にxの__add__メソッドにその型を追加する必要があります。

例えばnumpyには numpy.int32というクラスがあります。これを扱うために、基本のPythonのint型の__add__にnumpy.int32のことを追加しなければならないのであれば、追加モジュールが作成されるごとに基本のPythonのint型の__add__の変更が必要となり、モジュールの追加がとても難しくなります。

そうならないように、x + y はまず、x.__add__(y)を試してみます。それが成功すればその結果を返しますが、失敗した場合はy.__radd__(x)を試します。それが成功すればその結果を返します。両方とも失敗した場合には、TypeErrorの例外を上げます。

つまり、整数と整数の足し算の方法は左の整数が知っているけれども、整数と浮動小数点数の足し算は、左の整数がやり方を知らないので、右の浮動小数点数にできるかどうかを確かめ、右の浮動小数点数がやり方を知っていたので、計算ができる、という仕組みで動いているのです。

投稿2021/10/26 05:34

編集2021/10/26 05:39
ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Paalon

2021/10/26 05:57

Python はメソッドを後から付け加えることができないのでしょうか?
ppaul

2021/10/26 06:32

Pythonのクラスの中にはメソッドを後から付け加えることのできるものとできないものがあります。 ユーザ定義クラスの場合はできます。 組込みクラスの場合はほぼできません。 また、関数型のように古いバージョンのPythonではできたものが、新しいバージョンになってできなくなっているということもあります。
guest

0

https://docs.python.org/ja/3/reference/datamodel.html?highlight=radd#object.radd

これらのメソッドを呼んで二項算術演算 (+, -, *, @, /, //, %, divmod(), pow(), **, <<, >>, &, ^, |) の、被演算子が反射した (入れ替えられた) ものを実装します。 これらの関数は、左側の被演算子が対応する演算をサポートしておらず 3 、非演算子が異なる型の場合にのみ呼び出されます。

(1).__add__(1.) がNotImplementedになって、
かつ
11. が異なる型
なので
(1.).__radd__(1) が呼び出されて2.0という結果になります。(おそらくはそのように実行されているはずです)


参考
https://docs.python.org/ja/3/library/numbers.html#implementing-the-arithmetic-operations

投稿2021/10/26 05:33

編集2021/10/26 05:42
quickquip

総合スコア11235

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

数値に小数点をつけると、float(浮動小数点数)として解釈されます。

投稿2021/10/26 05:25

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問