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

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

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

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

Q&A

4回答

1764閲覧

str型で作られた計算式を計算したい

daemonright

総合スコア1

Python

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

0グッド

1クリップ

投稿2020/09/05 10:00

編集2020/09/05 12:02

#課題
ある理由でstr型で作られた計算式("2**8"のようなもの)を計算したいです。
#補遺
pythonのバージョンは3.7.7です。
evalは使えません

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

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

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

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

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

meg_

2020/09/05 10:11

・「試したこと」のコードを掲載ください。 ・「ある理由でstr型で作られた計算式("2**8"のようなもの)を計算したいです。」課題ですか?
can110

2020/09/05 12:26

>evalは使えません eval以外は使えますか?あるいは使えるものを明記ください。
daemonright

2020/09/05 12:44

eval以外はどのような手法があるかわからないので試して、できなければ補遺に追加する予定です。
can110

2020/09/05 12:48

evalでは計算できるのに使えないとのことですが、evalが使えない理由はなんでしょうか? ほかの手法も使えない可能性もあるかもしれないので確認です。
guest

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

dodox86

総合スコア9256

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

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

dodox86

2020/09/05 10:20

計算式を動的に外から入力したいようなときにはevalは有用で、「ある理由」が実務なのだと思って回答しましたが、もし授業の課題だったりしたのであればevalを使うことは求められていないでしょうね。計算するロジックを自力で構築せよ、と言うことなのだと思います。
guest

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
kazuma-s

総合スコア8224

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

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

0

「試したこと」はよく分かりませんでしたが次の様では駄目でしょうか。ipythonで実行しました。

ipython

1In [1]: 2**8 2Out[1]: 256 3 4In [2]: s="2**8" 5 6In [3]: s 7Out[3]: '2**8' 8 9In [4]: eval(s) 10Out[4]: 256 11 12In [5]:

投稿2020/09/05 10:14

ikapy

総合スコア1167

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問