• ベストアンサー
  • 困ってます

python 変数 演算子

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

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数104
  • ありがとう数0

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

  • ベストアンサー
  • 回答No.2

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

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 文字列比較の演算子

    Perl の世界から PHP にやってまいりました。 Perl では、文字列の比較には専用の演算子がありまして、 str1 eq str2 とすると、二つの文字列が同値かどうか調べられますが、PHP にはこのような演算子はないのでしょうか? www.php.net のマニュアルを見ても、そのような演算子がありません。 == 演算子が使えるものかと <?php $str1 = "this is string" ; $str2 = "this is string" if( $str1 == $str2 ) { echo "two string is same" ; } ?> などを試してみるとうまくいくようですが、www.php.net のマニュアルには「文字列を数値化して比較する」と書いてあり、本当に文字列比較が出来るか確信がもてず…。 結局、文字列を比較したいときには strcmp を呼び出していますが、これは PHP 的には正しいのでしょうか?

    • ベストアンサー
    • PHP
  • perl 条件演算子 範囲演算子についてです

    演算子 条件演算子 条件演算子 ?: は条件式の値により、2者のうちのどちらかを選択します。 $a=($x<10)?10:20; 変数$aの値が$x<10という条件において、真であれば:左側の10を選び、偽であれば:右側の20を選ぶ。 $a=10; 変数$aに10を代入する。 $a==5?print "5です。\n":print "5ではありません。\n"; 条件式でaが5であれば:左側の print "5です。\n"を表示します。 条件式でaが5でなければ:右側の print "5ではありません。\n"を表示します。 $a==10?print "10です。\n":print "10ではありません。\n"; 条件式でaが10であれば:左側の "10です。\n" を表示します。 条件式でaが10でなければ:右側の "10ではありません。\n" を表示します。 範囲演算子 範囲演算子 .. は、左側の値から右側の値まで、1つずつ増やした値の集まりです。 値には、半角英数字の数値または文字列が指定できる。 print 3..5; 3 4 5 と表示する。 一応、訳を下に書いたのですが合っていますでしょうか。

  • +演算子で文字列を連結できるのは何故?

    JAVAを勉強中に疑問に思ったので質問します。 JAVAでは演算子のオーバーロードができないと思いますが、 +演算子で文字列の連結できるのはどのような仕組みなんでしょう? Stringだけ特別なんでしょうか?

    • ベストアンサー
    • Java

その他の回答 (1)

  • 回答No.1
  • wormhole
  • ベストアンサー率28% (1443/5078)

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

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • Delphi Like 演算子

    MS Access VBA のLike 演算子みたいなものは、Delphiにないでしょうか? 2 つの文字列の比較を行なう演算子です。 例えば s1:='中野'; s2:='東京都中野区'; if s1 like s2 then flg=true; s2の文字列のなかにs1が含まれていることを判断する演算子ですが・・・

  • python [ ] 演算子?

    pyhonで、文字列・リストのindex(要素)にアクセスするのに[ ]を使うが、これは演算子と考えて良いのか疑問に思った。 pythonは”数学的正確さ”を目指した言語である以上、演算・関数・メソッドのいずれかに含められるはずで、関数・メソッドでない以上演算子であると考えるのが普通だと思うが、いかがでしょうか? indexにアクセスするものとの説明があるが、[ ]がどこに分類されるかの説明が見受けられない。 いかがなものでしょうか?

  • C++で>>演算子のオーバーロード

    C++学習者です。 Visual Studio Community 上で、ある教本を使って勉強しています。 現在Stringというクラスを作って、文字列に対して連結や部分文字列の取り出しなどができるようにするための色々な演算子のオーバーロードをする関数を定義していますが、疑問点がありますので、お聞きしたいと思います。 Stringクラスのプライベート変数は、文字列の長さを表すlength と、new 演算子で動的に確保するメモリー領域の始まりのアドレスを表す *sPtr の二つです。 クラス内ではパブリックなメンバー関数としていろいろな演算子がオーバーロードされていて、これらについてはよく理解できるのですが、friend 関数として定義されている入力演算子(>>)について納得がいかない部分があります。 その関数は次のようになっています。 istream &operator>>(istream &input, String &s) { char temp[100]; input >> setw(100) >> temp; s = temp; return input; } わからないのは s = temp; の部分です。 sはStringクラスのオブジェクトで、temp は単なる文字列なのに、なぜ代入できるのでしょうか? 代入演算子=のオーバーロード関数も下に挙げますが、この中でも単なる文字列をStringクラスのオブジェクトに代入できるようにはなってないように見えます。 const String &String::operator=(const String &right) { if (&right != this){ // avoid assignment of itself delete [ ] sPtr; length = right.length; sPtr = new char[ length + 1]; strcpy(sPtr, right.sPtr); } else cout<< "attempted to assign a String to itself \n\n"; return *this; } どなたか答えて頂けると有難いです。

  • String型の変数に代入されている2つの文字列を論理演算したいです。

    String型の変数に代入されている2つの文字列を論理演算したいです。 上記の通りなんですけど 例えば String a = "あいうえお"; String b = "aiueo"; このような二つの文字列を論理演算したあと 16進数の文字列としてあらたな変数(String型)に代入したいのですが どのように記述すればよろしいでしょうか? 初心者なものでわかりやすく説明していただけるとありがたいです。

    • ベストアンサー
    • Java
  • インクリメント演算子の前後

    インクリメント演算子(++や--)について伺いたいのですが、 以下のような場合、変数の前と後ろで何か処理上違いはあるのでしょうか? //文字列の最後までポインタを進める while ( *p1 ) { ++p1; } printf("%d" , *p++); のように(文法が間違っていたらすいません)、 出力した後でインクリメントするといった使い方の違いは分かるのですが、インクリメント単独処理での前後の違いがあれば教えていただきたいです。

  • 変数を演算子として利用することって方法ってありますか?

    char flag = '+'; という変数を作っておいて 普段ならi = 1 + 1; のように計算するところを i = 1 flag 1; なんてことをしてもコンパイルが通りませんが flagを演算子の'+'に変換する(演算子の+と認識させる)方法ってありますか?

  • 複数の演算子を選択する場合の処理

    複数の演算子を選択するプログラムがあり、選択する演算子によって計算方法を変えたいのですが、このときに今やっている方法はifの条件分岐にて処理を行っておりますが、演算子は変数に代入できないのでしょうか? 例えばべき乗を選択した場合は 変数= ^ また、これと同じく代入演算子の場合も 変数= ^= という方法があれば教えていただきたいです。 よろしくお願いいたします。

  • 量子力学における演算子と変数

    量子力学におえける演算子とは何かよくわからなくて困っています プログラミングをやっているのでプログラミングの話をしますが、プログラミングにおいて演算子とは、感覚的に言えばある変数を引数にして処理をするための関数的なもの + - x / の四則演算子が基本 sin() exp()などが演算子と言われても理解できるのですが 量子力学では、位置を表すxやyなども演算子として扱うと言われ プログラミング的にはそれらは関数のオペランドであり変数なので混乱しています 誰か上手く説明できる方がいらっしゃったら教えて下さい Ψを使った演算子の交換についての項で詰まっています

  • 正規表現の置換演算子に変数を埋め込むことをしたいのですが

    正規表現の置換演算子に変数を埋め込むことをしたいのですが $a = 'abcd0001'; $b = '0005'; $a =~ s/abcd([0-9]{4})/abcd\$b/; #=> $a=[abcd$b] print "\$a=[$a]\n"; とすると、abcd$bとなります。 置換演算子1行で、abcd0005とする方法はあるのでしょうか?

    • ベストアンサー
    • Perl
  • AS3の変数宣言で、変数名+00や01など変更しながら使いたい

    ActionScript3.0でnew演算子などで 変数(例えばobj)などを宣言する際に ある条件ならobj00、またある条件ならobj01 など条件に合わせて最後の2文字を変更したいです。 bnという変数に条件に従って00や01を代入して 以下のように作りましたがうまくいかないです。 ▼00の場合 var bn:String = "00"; var "obj"+bn: Loader = new Loader(); 分かる方は教えて下さい。宜しくお願いします。

    • ベストアンサー
    • Flash