"sin(x)*x^2"
などの文字列を実行時にユーザーが入力し、x
の任意の値で評価できるPython関数を生成するにはどうしたらよいでしょうか?Pythonでの数式解析
答えて
Pythonの表記法を使用すると、Python独自の内部コンパイラがこれを解析できます。
表記を少し変更すると、より幸せになれます。
import compiler
eq= "sin(x)*x**2"
ast= compiler.parse(eq)
あなたが作業できる抽象構文ツリーがあります。
Sageはmatlabの置き換えを意図しており、intro videosではあなたのケースとどれほど類似しているかが実証されています。彼らは幅広いアプローチをサポートしているようです。コードはオープンソースなので、著者がそのようなケースをどのように処理するかを自分で閲覧して見ることができます。
parser
はPLY、pyparsing、組み込みのトークナイザ、パーサ、ASTを使用して定義することができ
f = parser.parse('sin(x)*x^2').to_pyfunc()
。
ユーザの入力にeval
を使用しないでください。
ユーザー入力の 'eval'は本当に悪いです。 – igaurav
J.F. Sebastianのアドバイスを強調するために、「eval」と「コンパイラ」ソリューションでさえ、微妙なセキュリティホールに開放することができます。入力はどのくらい信頼できるのですか? 'compiler'を使うと、少なくともASTのgetattrルックアップのようなものを除外することができますが、Pythonの助けを借りた結果を確保するよりもPLYやPyparsingを使う方が簡単です。
また、 'compiler'は使いにくく、使いにくいです。 3.0では推奨されなくなりました。 'ast'モジュール(2.6で追加、 '_ast'として2.5で利用可能)を使うべきです。
vartecと一致します。私はSymPyを使用します - 特にlambdify関数はあなたが望むものを正確に行うべきです。
参照:http://showmedo.com/videotutorials/video?name=7200080&fromSeriesID=720
本の非常に素晴らしい説明のために。
幸運を祈り、
投稿に関連するすべての情報を含めてください。*「質問に答えたビデオへのリンクです」*は良い答えではありません。 –
pyparsingは、文字列が信頼できないソースからの場合は特に(http://pyparsing.wikispaces.com/)あなたがやりたいことがあります。
http://pyparsing.wikispaces.com/file/view/fourFn.pyも参照してください。完全な機能を備えた電卓です。
あなたは、Python parser
を使用することができます。
import parser
formula = "sin(x)*x**2"
code = parser.expr(formula).compile()
from math import sin
x = 10
print eval(code)
それはeval
純粋なより良い行いと、当然のことながら、コードインジェクションを回避!
- 1. Python xlwt数式解析エラー
- 2. 解析式 - Pythonの
- 3. Pythonでバイナリ形式を解析する
- 4. 数式解析ライブラリC++
- 5. 複素数で式を解析する
- 6. Linq式の解析
- 7. Pythonでの周波数解析
- 8. 数学方程式の解析
- 9. PythonでのXML解析:expaterrorが整形式でない
- 10. ブール式で解析+と*
- 11. Pythonで変数ファイルを解析する
- 12. Flink:エラー解析数値形式
- 13. 化学式解析
- 14. IMPORTXML式解析エラー
- 15. Pythonで不正形式のHTMLを解析する方法
- 16. Pythonのポイントオブジェクトへの数値の解析
- 17. Pythonでのテキストの解析
- 18. Pythonのコマンドライン引数の解析
- 19. Python:引数の構文解析のベストプラクティス
- 20. PythonでのMp3解析
- 21. Python - BeautifulSoupでのエラー解析
- 22. Pythonでのログ解析
- 23. iCalendar形式の解析
- 24. ビデオ解析のファイル形式
- 25. 算術式の解析parse
- 26. Python:サウンドファイルの周波数解析
- 27. Python XML解析ジャンクエラー - 複数のエンコーディング行
- 28. Pythonの数値解析マトリックス画像
- 29. 変数のPython正規表現解析
- 30. Python xpath解析
派生関数の使用方法に関するサンプルコードを追加できますか? – Don
@Don:構文ツリーを使う必要はありません。オリジナルの関数を使用します。 'x'を設定し、' from math import * 'を使って 'eval(" sin(x)* x ** 2 ")'を実行します。 –
eval()は動作しますが、答えは実際には問題を解決しません:( –