как вы оцениваете строку и слова, которые вы не можете оценить, остаются неизменными? - PullRequest
0 голосов
/ 14 июля 2020
string = input()
string = (''.join([str(eval(s)) if ('(' in s and ')' in s) else s for s in string.split(' ')]))
print(string)

с этим кодом есть некоторые проблемы:

  1. если я напишу 5- (2-sp.sqrt (4)), это даст мне ошибку EOF, потому что это разделит слова таким образом, что sp.sqrt (4) будет sp.sqrt (4)). Это должно быть sp.sqrt (4)

  2. , если я напишу «2-10», он не будет его оценивать и просто вернет «2-10»; он должен вернуть «-8». Если я напишу «2-10 * (2-5)», он вернет ответ на запись.

  3. вместо того, чтобы просто не оценивать ту часть, которую код не распознает , это даст мне сообщение об ошибке, что нераспознанная часть не определена. (например, '2 + x-10- (5 * 10)' ---- имя 'x' не определено. Оно должно возвращать: 'x-58'

1 Ответ

2 голосов
/ 14 июля 2020

Проблема - 1 :

это даст мне ошибку EOF, потому что он разделит слова таким образом, что sp.sqrt (4) будет sp.sqrt (4))

  • Нет, он не разделяет строку таким образом, потому что вы разделяете строку с помощью '', поэтому вывод для функции разделения будет ['5-(2-sp.sqrt(4))']
  • Он не выдаст ошибку до тех пор, пока ваш ввод не будет иметь допустимое выражение python (в этом случае я подозреваю, что проблема связана с sp)

Проблема - 2 :

если я напишу «2-10», он не будет его оценивать и просто вернет «2-10», но когда я напишу «2-10 * ( 2-5) 'он вернет ответ на запись.

Это потому, что вы вызвали функцию eval (), только если есть оба' ('и') '

Проблема - 3 :

Это потому, что eval () принимает только допустимые python выражения (вы не можете поместить не объявленную переменную непосредственно внутри параметра). В вашем случае x не был объявлен раньше.

Решение:

Существует функция sympy parse_expr, которая, вероятно, делает то, что вы хотите здесь:

In [20]: from sympy import parse_expr

In [21]: parse_expr('5-(2-sqrt(4))')
Out[21]: 5

In [22]: parse_expr('2-10')
Out[22]: -8

In [23]: parse_expr('2+x-10-(5*10)')
Out[23]: x - 58
...