こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

python 変数 演算子

比較演算子の>、<を変数に入れるには文字列として''で囲まなければならず、string型になってしまいます。
やりたいことは、比較条件式の2 > 1の>を変数をいれて>、<切り替わるようにしたいのですがなかなかうまくいきません。
なにかいい方法ないでしょうか。よろしくお願いします。

投稿日時 - 2019-09-18 07:14:43

QNo.9657987

困ってます

質問者が選んだベストアンサー

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が役に立った」と投票しています

-広告-
-広告-

回答(2)

ANo.1

演算子を変数に入れたりといったことはできませんが(そういう事ができるプログラミング言語はおそらくないです)、
比較条件式自体を文字列にしてevalで評価する事はできるかと思います。
eval('2 > 1')

投稿日時 - 2019-09-18 20:17:29

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-