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

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

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

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

Q&A

解決済

4回答

365閲覧

python かけ算

barorin

総合スコア9

Python

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

1グッド

2クリップ

投稿2020/04/23 07:04

a=3
b=+
c=1
として
a b cが
3 + 1となるようなものをpythonで作りたいです
bが何型であれば算用記号だと認識するのでしょうか?

DrqYuto👍を押しています

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

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

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

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

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

guest

回答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

nskydiving

総合スコア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
Kenji.Noguchi

総合スコア358

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

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

hayataka2049

2020/04/23 08:52

|を乗っ取って作る中置記法、面白い……けど出典が要りますね。
Kenji.Noguchi

2020/04/23 21:19

出典を追加しました。10年以上前にコピペしたのですが、探したらありました。オリジナルは2005年でした。
guest

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

LouiS0616

総合スコア35660

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

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

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

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問