2017-02-23 67 views
1

我的代码是:Python 3.x版本。要输入的功能

from sympy import symbols 

x = symbols ('x') 

def f(x): 
    y = input("what is your function?") 
    return y 
print (f(1)) 

但如果我把X ** 2 + 3作为输入并运行代码,然后它打印X ** 2 +3 为什么出现这种情况?

我认为内置函数输入不会将'x'作为变量。

我该如何解决?

+0

但括号甚至不匹配? –

+0

这只是一个错字错误。我编辑 – user88914

+2

你得到一个带有输入的字符串,返回并打印它。我假设你想要输入被解析并作为数学函数处理? –

回答

1

由于您想在表达式中使用变量名称,因此不能直接使用ast.litteral_eval,这是(邪恶)eval的安全替代方案。

至少你可以尝试从全球范围内移除内建的:

def f(x): 
    y = input("Function:") 
    return eval(y, {'__builtins__': {}}, {'x': x}) 

但要注意,即使有内建去除eval may not be safe

你也可以使用由史蒂芬提议的变动:

def g(**args): 
    y = input("Function:") 
    return eval(y, {'__builtins__': {}}, args) 
+0

非常感谢!有用! – user88914

0

你可以做这样的事情来得到一个表达式与任何匹配的参数格式化。虽然它不起作用,如果你有例如xsx作为变量,因为x将取代xxs,因为我没有在这个例子中处理,所以要注意这一点。

def get_exp(**kwargs): 
    print(kwargs) # left in to show how kwargs looks 
    inp = input('--> ') 
    for k, v in kwargs.items(): 
     inp = inp.replace(k, str(v)) 
    return inp 

# Use 
>>> exp = get_exp(x = 5, y = 10) 
{'x': 5, 'y': 10} 
--> x ** 5 + (y - 2) 
>>> exp 
'5 ** 5 + (10 - 2)' 
>>> exp = get_exp(x = 5, y = 10) 
{'x': 5, 'y': 10} 
--> z + x 
>>> exp 
'z + 5' 

作为评价表达外观here使用ast模块或here用于pyparsing安全评估输入。

如果您想使用sympy模块,则here有一个使用示例。但请注意sympy不被认为是安全的。