10

文字列を受け取り、演算子の優先順位に従って結果を出力する Python プログラムを実装する最良の方法は何ですか (例: "4+3*5" は 19 を出力します)。この問題を解決する方法をグーグルで検索しましたが、それらはすべて複雑すぎたため、(比較的) 単純な方法を探しています。

明確化: eval() よりも少し高度なものが必要です - 他の演算子 (最大演算子 - 4$2 = 4 など) を追加できるようにしたい、または専門的というよりも学問的にこれに興味があります - 私はしたいですこれを行う方法を知っています。

4

6 に答える 6

16

「学術的に興味がある」場合は、演算子の優先順位を使用してパーサーを作成する方法について学びたいと考えています。

Simple Top-Down Parsing in Pythonは、やりたいことを正確に行うパーサーの例を作成する素晴らしい記事です: 数式を評価します。

独自の最初のパーサーを作成してみることを強くお勧めします。それは、「ああ、そういう仕組みだ」と思う瞬間の 1 つです

于 2009-10-09T18:59:59.297 に答える
2

それが、Python の "eval" 関数が行うことです。

result = eval(expression)

ただし、主に関数を呼び出すなど、もっと多くのことができるので注意してください。安全のために、ローカルまたはグローバルにアクセスできないようにする必要があります。また、トリッキーなインポートを含む組み込みメソッドにアクセスできるため、それへのアクセスもブロックする必要があります。

result = eval(expression, {'__builtins__': None}, {})

ただし、それはセキュリティが必要な場合、つまり、誰でも任意の式を入力できるようにする場合に限られます。

もちろん、この方法ではすべての locla 変数の使用をブロックするため、使用する変数がないため、辞書でアクセスする必要がある変数だけを渡す必要があります。

vars = {'__builtins__': None, 'x': x}
result = eval(expression, vars, {})

または類似。

于 2009-10-09T18:45:36.037 に答える
2

もう 1 つの可能性は、一般的なパーサー ビルダーであるPyparsingを調べることです。必要以上に強力ですが、実装する方が速い場合があります。

于 2009-10-09T20:08:43.637 に答える
1

私は Python や非常に Pythonic なメソッドにはあまり詳しくありませんが、Gang of Four の本で定義されているInterpreter patternを見ることができます。これは「言語」を処理するために設計されており、数式は特定の言語の規則に従います。実際、ウィキペディアの例は、実際には RPN 計算機の Java 実装です。

于 2009-10-09T18:39:03.383 に答える
0

Javaの代替はここにありますhttp://code.google.com/p/expressionoasis/

于 2010-10-29T18:45:30.057 に答える
0

このレシピは、あなたの問題に対する適切な答えを提供します:

http://code.activestate.com/recipes/496746-restricted-safe-eval/

これにより、コンピューターやプログラムに害を及ぼさない限定ステートメントを評価できます。

于 2011-02-25T09:48:23.283 に答える