python 変数 演算子
比較演算子の>、<を変数に入れるには文字列として''で囲まなければならず、string型になってしまいます。
やりたいことは、比較条件式の2 > 1の>を変数をいれて>、<切り替わるようにしたいのですがなかなかうまくいきません。
なにかいい方法ないでしょうか。よろしくお願いします。
投稿日時 - 2019-09-18 07:14:43
Pythonの演算子は実際は演算子ではなく関数です。例えば、
>>> 1.3 + 2.4
3.7
を次のように実行しても同じです。
>>> 1.3.__add__(2.4)
3.7
対話コンソールで実行して確認してみてください。
どういうことかというと、floatクラスに__add__(self, other)というメソッドが実装されていて、ソースコードに+で足し算が指示されると、このメソッドが呼び出されるからです。もちろんintクラスにも同じメソッドが実装されていて、整数どうしの足し算ではこちらが呼び出されます。
自動型変換が行われるので、以降floatクラスのメソッドで説明します。intクラスにも同じメソッドがあります。必要に応じて使い分けてください。
比較演算子<はfloat.__lt__(self, other)メソッド、
比較演算子>はfloat.__gt__(self, other)メソッドです。
対話コンソールで次を試してみてください。
>>> a = 1.2
>>> b = 2.3
>>> a < b
True
>>> a > b
False
>>> a.__lt__(b)
True
>>> a.__gt__(b)
False
すべて演算子はメソッドつまり関数なので、その名前で変数に代入することができますし、代入した変数の名前で呼び出すことができます。
>>> funL = float.__lt__
>>> funG = float.__gt__
>>> funL(a,b)
True
>>> funG(a,b)
False
というわけで、演算子はメソッド呼び出しという実体の無いものなので、演算子を変数に代入するということはできないが、実行されるメソッドを変数に代入することはできる、ということです。
if文や条件演算子を使わず<と>を直接切り替えるということがよくわかりませんが、上記funLとfunGを準備しておいて、例えばfunLGという変数にその時々に応じてfunLかfunGのどちらかを代入し、funLG(a,b)を呼び出すということで課題は解決しないでしょうか?
あと、これは私もよくわからないのですが、上の実行例ではメソッドを代入した変数の名前を使ってメソッドを呼び出すとき、
>>> funL(a,b)
True
>>> funG(a,b)
False
としています。これを普通のメソッドの呼び出し方a.funL(b)などとするとエラーになります。
>>> a.funL(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'float' object has no attribute 'funL'
>>> a.funG(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'float' object has no attribute 'funG'
参考URL:https://pknight.hatenablog.com/entry/20170321/1490061276
投稿日時 - 2019-10-12 16:38:55
このQ&Aは役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています