a=3
b=+
c=1
として
a b cが
3 + 1となるようなものをpythonで作りたいです
bが何型であれば算用記号だと認識するのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
a b cが
3 + 1となるようなものをpythonで作りたいです
そのようなことがしたい場合は、文字列にしておいて、eval を使うのが良いかと思います。
python
1a='3' 2b='+' 3c='1' 4 5print(eval(a + b + c))
出力結果
4
bが何型であれば算用記号だと認識するのでしょうか?
Python にそのような型はありません。
投稿2020/04/23 07:20
総合スコア6500
0
+は演算子で型はありません。またPythonでは演算子を新たに定義することもできません。一番見た目が近くなりそうなのは、+を文字列にすればこんな風に書けます。
Python3
1import operator 2 3def calc(*args): 4 bin_op_map = { 5 "+": operator.add, 6 "-": operator.sub, 7 "*": operator.mul, 8 "/": operator.floordiv 9 } 10 stack = [] 11 it = iter(args) 12 for a in it: 13 op = bin_op_map.get(a) 14 if op: 15 stack.append(next(it)) 16 if len(stack) < 2: 17 raise ValueError("オペランドが足りません") 18 r = stack.pop() 19 l = stack.pop() 20 stack.append(op(l, r)) 21 else: 22 stack.append(a) 23 #計算結果を取り出す 24 return stack.pop() 25 26a = 3 27b = "+" 28c = 1 29print(calc(a, b, c)) 30 31# 4
ところで、Pythonではクラスを定義すれば演算子をオーバーライドすることができます。この機能を使って論理OR演算子の|をオーバーライドして、中置記法の演算子っぽいものを作った人がいます。
例えば"|たす|"と言う足算をする演算子っぽいものを定義してみます。
Python3
1# 出典 http://code.activestate.com/recipes/384122-infix-operators/ 2class Infix: 3 def __init__(self, function): 4 self.function = function 5 def __ror__(self, other): 6 return Infix(lambda x, self=self, other=other: self.function(other, x)) 7 def __or__(self, other): 8 return self.function(other) 9 def __rlshift__(self, other): 10 return Infix(lambda x, self=self, other=other: self.function(other, x)) 11 def __rshift__(self, other): 12 return self.function(other) 13 def __call__(self, value1, value2): 14 return self.function(value1, value2) 15 16たす = Infix(lambda x,y: x+y) 17ひく = Infix(lambda x,y: x-y) 18かける = Infix(lambda x,y: x*y) 19わる = Infix(lambda x,y: x//y) 20 21a = 3 22c = 1 23print(a|たす|c) 24 25# 4 26 27print(a|たす|c|かける|2) 28# 8
以上ご参考まで。
投稿2020/04/23 07:46
編集2020/04/23 21:16退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/04/23 21:19
0
お手軽さと拡張性を両立するなら、文字列で持っておいてif文で分岐するのが良いでしょう。
Python
1b = '+' 2 3... 4 5if b == '+': 6 ans = a + c 7elif ... 8 9print(ans)
関数オブジェクトを持つのも良いアイデアですが、慣れないうちは難しく見えるかもしれません。
Python
1b = lambda x1, x2: x1 + x2 # operator.add をそのまま使っても可 2 3... 4 5ans = b(a, c) 6print(ans)
投稿2020/04/23 07:21
総合スコア35668
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Pythonは違いますが、+
が関数の言語はあります。Lispなどの関数型言語がこれに相当します。
HyというPythonの上に実装されたLispがあるので、これで書いてみます。かっこの先頭が呼び出されるもの、その後ろが引数であることに留意してください。
The Hy Manual — hy 0.18.0 documentation
Lisp
1=> (setv a 3) 2=> (setv b +) 3=> (setv c 1) 4=> (b a c) 54
投稿2020/04/23 09:01
総合スコア30935
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。