什麼是實現一個Python程序的最佳方式,它將接收一個字符串並根據運算符優先級輸出結果(例如:「4 + 3 * 5」將輸出19)。我一直在尋找解決這個問題的方法,但他們都太複雜了,我正在尋找一個(相對)簡單的問題。我希望能夠添加其他運算符(例如最大運算符 - 4 $ 2 = 4),或者我也更關注這個學術上的問題,而不是專業意義上的問題 - 我想知道如何這樣做。數學表達式評估
數學表達式評估
回答
如果您「學術上有興趣」,您想了解如何編寫具有運算符優先級的解析器。
Simple Top-Down Parsing in Python是一個不錯的文章,它構建了一個示例解析器來完成您想要做的事情:評估數學表達式。
我強烈建議你去編寫自己的第一個解析器 - 這是其中的一個「啊,即這是如何工作的」瞬間!
我看了一眼,看起來你鏈接的文章實現了Python中的Interpreter模式。 –
我對Python和任何極端的Pythonic方法都不太熟悉,但是您可以看看在四人幫中定義的Interpreter pattern。它是爲處理「語言」而設計的,數學表達式遵循特定的語言和規則。事實上,Wikipedia上的例子實際上是一個RPN計算器的Java實現。
這就是「eval」函數在Python中的作用。
result = eval(expression)
要小心的是它可以做很多更多,主要是調用函數,所以爲了安全起見,你應該確保它無法訪問當地人或全局。此外,您還可以訪問內置的方法,其中包括棘手的進口所以你需要阻止訪問,以及:
result = eval(expression, {'__builtins__': None}, {})
但是如果你需要的安全性,只是,那就是如果你允許任何人輸入任何表達。
當然,因爲你用這種方式阻止了所有locla變量的使用,所以你不需要使用任何變量,因此你只需要傳入應該在字典中訪問的那些變量。
vars = {'__builtins__': None, 'x': x}
result = eval(expression, vars, {})
或類似的。
eval的問題出現在表達式=「system.os(rm -rf \)」時。如果你在* nix中以root身份運行它,那麼繁榮就是機器。或者如果它與Windows相同,尤其是因爲有太多人以管理員身份運行Windows。 –
只有你已經完成'從os導入系統'並且不提供globals和locals目錄。這是我在我的例子中爲此做的。 –
在表達式中,你可以再次從os導入系統然後使用它。所以是的,我的例子只有在你已經從系統導入os時才能工作,但是通過擴展我的表達式,你可以導入任何你想要的東西並使用它。 –
另一種可能性是查看Pyparsing,這是一個通用的解析器構建器。它比你需要的更強大,但實施起來可能會更快。
的Java的替代方案是在這裏http://code.google.com/p/expressionoasis/
這receipe給出了正確的答案,你的問題:
http://code.activestate.com/recipes/496746-restricted-safe-eval/
它可以讓你的eval不能損害您的計算機或程序有限的聲明。
- 1. 評估數學表達式
- 2. 數學表達式評估
- 3. Java遞歸數學表達式評估
- 4. Mono.CSharp:評估數學表達式
- 5. 評估c中的數學表達式#
- 6. 評估一個數學表達式(python)
- 7. 評估數學表達式與正則表達式
- 8. 評估表達式
- 9. 如何評估由字符串表示的數學表達式?
- 10. 評估列表<String>作爲一個數學表達式
- 11. 如何評估(數學)字符串表達式,vb.net
- 12. 如何評估簡單的數學表達式?
- 13. 編譯器如何評估數學表達式?
- 14. 評估字典變量上的數學表達式
- 15. 評估一個簡單的字符串數學表達式
- 16. 從一個字符串使用VB評估數學表達式
- 17. 在鈦中評估數學表達式javascript
- 18. 評估給出文本的數學表達式
- 19. 貝斯特和評估數學表達式
- 20. 如何確定數學表達式的評估順序?
- 21. 對數學表達式出錯的評估:python
- 22. Java:僅從左到右評估數學表達式
- 23. 無法使用Mathos Math Prser評估數學表達式
- 24. IOS。解析和評估邏輯和數學表達式
- 25. 評估字符串中的數學表達式
- 26. 用變量評估數學表達式。 (java 8)
- 27. VB.Net-評估字符串中的數學表達式
- 28. 如何從J2ME中的字符串評估數學表達式
- 29. 如何在java中評估字符串數學表達式
- 30. Python - 評估字符串內的數學表達式
http://docs.python.org/reference/simple_stmts.html#exec – nlucaroni
看看:http:// stackoverflow。com/questions/400050 /閱讀並運行一個數學表達式在python –
嘗試「評估」,而不是「解決」,這表明能夠找到「x」給出「4x - 6 = 4」。 – dmckee