나는 이와 같은 변수 형태로 설명 된 표현이 있습니다
's1*3 - (s2-s1)*1'
필요에 따라 변경할 수있는 s1 및 s2 값을 지정했습니다.
python ast 모듈을 사용 하여 각각의 s1 및 s2 값 (s1 = 20, s2 = 30)을 대체하여이 표현식을 평가할 수 있습니다.
import ast
import operator as op
operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul,
ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor,
ast.USub: op.neg}
def eval_(node):
if isinstance(node, ast.Num): # <number>
return node.n
elif isinstance(node, ast.BinOp): # <left> <operator> <right>
return operators[type(node.op)](eval_(node.left), eval_(node.right))
elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., -1
return operators[type(node.op)](eval_(node.operand))
else:
raise TypeError(node)
>>> str1 = '20*3 - (30-20)*1'
>>> node = ast.parse(str1, mode='eval')
>>> eval_(node.body)
50
변수를 실제 값으로 바꿀 필요없이이 식을 어떻게 평가해야합니까?
감사
eval
기능 을 사용할 수 있습니다 . 그러나 eval
문자열을 실행하기 때문에 사용에주의해야합니다 . 신뢰할 수없는 입력에서 평가할 문자열을 허용하면 매우 위험 할 수 있습니다. 예를 들어 평가되는 문자열이 "os.system('rm -rf /')"
? 실제로 컴퓨터의 모든 파일을 삭제하기 시작합니다.
>>> eval('20*3 - (30-20)*1')
50
더 나은 솔루션으로 파이썬의 내부 컴파일러로 방정식을 구문 분석 할 수 있습니다 .
>>> s1=20
>>> s2=30
>>> eq='s1*3 - (s2-s1)*1'
>>> compiler.parse( eq )
Module(None, Stmt([Discard(Sub((Mul((Name('s1'), Const(3))), Mul((Sub((Name('s2'), Name('s1'))), Const(1))))))]))
따라서 방정식을 평가하려면 사용하는 것보다 더 안전하게 input
사용 compile
하고 평가할 수 있습니다 !
>>> eq='s1*3 - (s2-s1)*1'
>>> a=compile(eq,'','eval')
>>> eval(a)
50
또한 sympy
기호 수학을위한 Python 라이브러리를 사용할 수 있습니다 . 코드를 이해하고 쉽게 확장 할 수 있도록 코드를 최대한 단순하게 유지하면서 완전한 기능을 갖춘 컴퓨터 대수 시스템 (CAS)이되는 것을 목표로합니다. SymPy는 전적으로 Python으로 작성되었으며 외부 라이브러리가 필요하지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다