文字列があれば
equation = "1+2+3+4"
それを int に変更して答えを同一視するにはどうすればよいですか? このようなことを考えていましたが、エラーが発生します。
answer = (int)equation
print(answer)
式には以下が含まれる可能性があります+-*/
文字列があれば
equation = "1+2+3+4"
それを int に変更して答えを同一視するにはどうすればよいですか? このようなことを考えていましたが、エラーが発生します。
answer = (int)equation
print(answer)
式には以下が含まれる可能性があります+-*/
計算機を世界に公開したい場合、クラッカーがこれを回避できるかどうかを確認したいと思います。
import string
def less_dangerous_eval(equation):
if not set(equation).intersection(string.ascii_letters + '{}[]_;\n'):
return eval(equation)
else:
print("illegal character")
return None
less_dangerous_eval('1*2/3^4+(5-6)')
戻り値:
3
これは、不適切な構文 (try/except ブロックで修正可能) を与えるか、システム内のすべてのメモリを占有する操作 (try/except をキャッチするのはもっと難しいかもしれません) を与えることで壊れる可能性があることを知っていますが、私は誰かが制御を取得する方法を現在認識していません。
これは、数字とプラスしかない場合に機能します。
answer = sum(float(i) for i in equation.split('+'))
または、整数のみになることがわかっている場合
answer = sum(int(i) for i in equation.split('+'))
それ以上の評価ができるようになりたい場合は、次の宿題を行うことをお勧めします。
string モジュール (string.digits を含む) を検索します。
あなたの操作を持っている数学モジュール
適切な順序で操作を実行するロジックを作成する
幸運を!
eval
入力を使用して確認することをお勧めします。
def evaluate(s):
import string
for i in s:
if i not in "+-*/ " + string.digits:
return False # input is not valid
return eval(s)
すでに述べたように、eval
は安全ではなく、安全にするのは非常に困難です。これを説明している非常に優れたブログ記事を見たのを覚えています。ただしast.literal_eval
、安全ですが、許可されていません。可能な限り代わりに__import__
使用することを強くお勧めします。残念ながら、この場合は不可能です。ただし、足し算と掛け算のみをサポートする必要がある場合など、別のケースでは、代わりに使用できます (使用する必要があります)。ast.literal_eval
eval
literal_eval
一方、これが構文解析について学ぶための宿題である場合は、別の方法でこれを行うことをお勧めします。私が教師だったら、eval
「非常に賢いですが、これでは抽象的な構文ツリーのテストに合格するのに役立ちません」という答えを返すでしょう。(ちなみに、これを「適切に」実装したい場合は、これを確認する必要があります)。