#課題
ある理由でstr型で作られた計算式("2**8"のようなもの)を計算したいです。
#補遺
pythonのバージョンは3.7.7です。
evalは使えません
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/05 12:26
2020/09/05 12:44
2020/09/05 12:48
2020/09/06 15:07
回答4件
0
eval
が使えます。
eval - Python3.7.8
sh
1$ python3 2Python 3.6.9 (default, Apr 18 2020, 01:56:04) 3[GCC 8.4.0] on linux 4Type "help", "copyright", "credits" or "license" for more information. 5>>> eval("1+2+3") 66 7>>> v= eval("1+2+3") 8>>> print(v) 96 10>>> v= eval("2 ** 3") 11>>> print(v) 128 13>>> eval("2 ** 8") 14256 15>>> v = eval("2 ** 8") 16>>> print(v) 17256
投稿2020/09/05 10:12
総合スコア9256
0
評価したい式を構文解析するクラスを定義すれば簡単に実装できると思います。
投稿2020/09/06 06:14
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんなのはどうでしょうか?
Python
1import re 2import math 3 4class Expr: 5 op = "+-*/\7\7" 6 pat = r"\d+.?\d*([eE][+-]?\d+)?"; 7 8 def __init__(self, s): 9 self.c = '.' 10 self.s = s 11 self.n = len(s) 12 self.pos = 0 13 self.val = 0.0 14 15 def get(self): 16 while self.pos < self.n: 17 self.c = self.s[self.pos] 18 self.pos += 1 19 if self.c.isdigit(): 20 res = re.match(Expr.pat, self.s[self.pos-1:]) 21 self.val = float(res.group()) 22 self.pos += res.span()[1] - 1 23 return '0' 24 if self.c == '*' and self.s[self.pos] == '*': 25 self.pos += 1 26 self.c = '\7' 27 return self.c 28 if self.c != ' ': 29 return self.c 30 self.c = '\0' 31 return self.c 32 33 def expr(self, i): 34 v = 0.0 35 if i < 6: 36 v = self.expr(i+2) 37 while self.c == Expr.op[i] or self.c == Expr.op[i+1]: 38 if self.c == '+': v += self.expr(i+2) 39 elif self.c == '-': v -= self.expr(i+2) 40 elif self.c == '*': v *= self.expr(i+2) 41 elif self.c == '/': v /= self.expr(i+2) 42 else: v **= self.expr(i) 43 elif self.get() == '0': v = self.val; self.get() 44 elif self.c == '(': 45 v = self.expr(0) 46 if self.c == ')': self.get() 47 else: self.c = '\1' 48 elif self.c == '+': v = self.expr(i) 49 elif self.c == '-': v = -self.expr(i) 50 elif self.s[self.pos-1:self.pos+4] == 'sqrt(': 51 self.pos += 4 52 v = math.sqrt(self.expr(0)); 53 if self.c == ')': self.get() 54 else: self.c = '\1' 55 else: self.c = '\1' 56 return v 57 58 def ok(self): 59 return self.c == '\0' 60 61while True: 62 s = input('>> ') 63 if s == '.': break; 64 e = Expr(s) 65 v = e.expr(0) 66 if e.ok(): print(' ' , v if v != int(v) else int(v)) 67 else: print(' Error')
実行例
text
1>> 1+2*(3-4)/5 2 0.6 3>> 355 / 113 4 3.1415929203539825 5>> 2**10 6 1024 7>> .
追記
sqrt を追加しました。sqrt(2) は 1.4142135623730951 になります。
同様にして、exp, log, sin, cos, tan の追加も可能です。
追記2
eval の代わりに os.system を使ってもいいのでしょうか?
Python
1import os 2 3while True: 4 s = input(">> "); 5 if s == '.': break; 6 cmd = "python -c 'print(" + s + ")'" 7 os.system(cmd)
daemonright さん、質問をしたまま放置はよくないですよ。
コメントをお願いします。
投稿2020/09/06 02:21
編集2020/09/07 16:36総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。