Чтение и запуск математического выражения в Python - PullRequest
5 голосов
/ 30 декабря 2008

Используя Python, как бы я прочитал (из строки, файла или URL) математическое выражение (1 + 1 - хорошее начало) и выполнил его?

Помимо захвата строки, файла или URL, я понятия не имею, с чего начать.

Ответы [ 6 ]

7 голосов
/ 30 декабря 2008

Поскольку python поддерживает некоторые алгебраические формы, вы можете сделать:

eval("1 + 1")

Но это позволяет вводу выполнить все, что определено в вашем env:

eval("__import__('sys').exit(1)")

Кроме того, если вы хотите поддерживать что-то, что Python не поддерживает, подход не работает:

x³ + y² + c
----------- = 0
     z

Вместо этого вы можете реализовать токенизатор и парсер с ply . Оценка вещи типа «1 + 1» не должна занимать более десяти строк или около того.

Вы также можете реализовать токенизатор и парсер вручную. Читайте о LL и LR парсерах. Прежде чем пытаться это сделать, лучше сначала научиться использовать генераторы парсеров.

2 голосов
/ 31 декабря 2008

Не пишите свой собственный парсер, если не хотите научиться писать парсер. Как уже упоминалось в комментариях @ J.F. Себастьян, я бы предложил полноценную систему компьютерной алгебры (CAS) , как SAGE . Он будет обрабатывать математические операторы намного сложнее, чем 1 + 1:)

2 голосов
/ 30 декабря 2008

Если вы получаете выражение в виде строки, вам нужно проанализировать его в его операторах и операндах, а затем обработать полученное дерево. Это не проблема питона как таковая. но общий вопрос о том, как обращаться с математическими выражениями, представленными в виде строк.

Быстрый гугл показывает кучу лексических парсеров для python.

1 голос
/ 30 декабря 2008

Читайте о функции input .

1 голос
/ 30 декабря 2008

Возможно eval - это то, что вы ищете?

>>> eval('1+1')
2
0 голосов
/ 25 февраля 2011

Вы можете воспользоваться собственными возможностями оценки Python. Однако слепое использование eval () очень опасно, поскольку кто-то может обмануть вашу программу:

eval( (__import__("os").system("rm important_file") or 1) + 1)

Правильный способ использования eval - следующий рецепт, который убедится, что в выражении, которое вы оцениваете, нет ничего опасного:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...