¿Cómo puedo (fácilmente) tomar una cadena como "sin(x)*x^2"
que un usuario podría ingresar en el tiempo de ejecución y producir una función de Python que podría evaluarse para cualquier valor de x
?Análisis de ecuaciones en Python
Respuesta
El propio compilador interno de Python puede analizar esto, si usa la notación de Python.
Si cambia ligeramente la notación, será más feliz.
import compiler
eq= "sin(x)*x**2"
ast= compiler.parse(eq)
Obtiene un árbol de sintaxis abstracto con el que puede trabajar.
Sage está destinado como reemplazo de Matlab y en intro videos se demuestra cómo se manejan casos similares a los suyos. Parecen apoyar una amplia gama de enfoques. Como el código es de código abierto, puede navegar y ver por usted mismo cómo manejan los autores dichos casos.
f = parser.parse('sin(x)*x^2').to_pyfunc()
Dónde parser
podría definirse usando PLY, pyparsing, tokenizer incorporado, analizador, ast.
No utilice eval
en la entrada del usuario.
'eval' en la entrada del usuario es realmente malo. – igaurav
Para enfatizar los consejos de J.F. Sebastian, 'eval' e incluso las soluciones de 'compilador' pueden abrirse a sutiles problemas de seguridad. ¿Qué tan confiable es la entrada? Con 'compilador' al menos puedes filtrar cosas como búsquedas getattr del AST, pero he descubierto que es más fácil usar PLY o pyparsing para este tipo de cosas que asegurar el resultado de dejar que Python te ayude.
Además, 'compilador' es torpe y difícil de usar. Está en desuso y eliminado en 3.0. Debe usar el módulo 'ast' (agregado en 2.6, disponible en 2.5 como '_ast').
De acuerdo con vartec. Yo usaría SymPy, en particular, la función lambdify debería hacer exactamente lo que usted quiere.
Ver: http://showmedo.com/videotutorials/video?name=7200080&fromSeriesID=720
para una muy agradable explicación de esto.
mejores deseos,
Incluya toda la información relevante en la publicación en sí, * "Aquí hay un enlace a un video que responde a la pregunta" * no es una buena respuesta. –
pyparsing podría hacer lo que quiere (http://pyparsing.wikispaces.com/), sobre todo si las cadenas son de una fuente no confiable.
Vea también http://pyparsing.wikispaces.com/file/view/fourFn.py para una calculadora bastante completa desarrollada con él.
Puede usar Python parser
:
import parser
formula = "sin(x)*x**2"
code = parser.expr(formula).compile()
from math import sin
x = 10
print eval(code)
Se comporta mejor que pura eval
y, por supuesto, evita la inyección de código!
Una cosa importante a tener en cuenta es que usar 'eval()' puro en la entrada del usuario puede ser [** muy peligroso **] (https://stackoverflow.com/questions/1832940/is-using-eval-in-python -a-bad-practice/1832957 # 1832957). –
¿Cómo evita esto la inyección de código? – devxeq
@devxeq Quiero decir que no aceptará cosas tales como 'formula =" os.system ('format C:') "' :) – Don
- 1. Biblioteca de análisis de ecuaciones C++
- 2. Ecuaciones diferenciales en Python
- 3. Resolviendo ecuaciones polinomiales en Python
- 4. Manipulación de ecuaciones matemáticas en Python
- 5. ¿Cómo puedo resolver ecuaciones en Python?
- 6. Análisis de Log en Python
- 7. Análisis de XML en Python
- 8. renderizar las ecuaciones de los usuarios en Python
- 9. Manera más simple de resolver ecuaciones matemáticas en Python
- 10. Ecuaciones guardadas en Haskell
- 11. Ecuaciones diferenciales en Java
- 12. Resolviendo ecuaciones en .NET
- 13. Bloque de ecuaciones de la izquierda de ecuaciones
- 14. Serie de tiempo de análisis en Python
- 15. ¿Hay un módulo de Python para resolver ecuaciones lineales?
- 16. Análisis de código estático en Python?
- 17. Análisis de S-Expressions en Python
- 18. Análisis flexible de cadenas numéricas en Python
- 19. biblioteca para visualizar ecuaciones matemáticas (como un editor de ecuaciones)
- 20. resolver ecuaciones funcionales mediante programación
- 21. Resolviendo numéricamente ecuaciones no lineales
- 22. ¿Cómo escribir ecuaciones en html?
- 23. Python - análisis léxico y tokenización
- 24. análisis semántico latente en discrepancia Python
- 25. Starfield Screensaver Ecuaciones
- 26. Angular Momentum Transfer ecuaciones
- 27. Cómo vectorizar ecuaciones?
- 28. Mostrando ecuaciones Mathml
- 29. Javadoc con ecuaciones?
- 30. Análisis de archivos de texto con Python
¿Se puede agregar un código de muestra sobre cómo usar la función derivada? – Don
@Don: No necesita usar el árbol de sintaxis. Usa la función original. 'eval (" sin (x) * x ** 2 ")' después de establecer 'x' y usar' de math import * '. –
eval() funciona, pero la respuesta no resuelve realmente el problema :( –