Python 从脚本[sympy]将符号作为输入
1.我想在一个模块中定义一个函数,它是交互式的,也可以接受符号变量 假设函数是Python 从脚本[sympy]将符号作为输入,python,sympy,Python,Sympy,1.我想在一个模块中定义一个函数,它是交互式的,也可以接受符号变量 假设函数是 (来源:) 那我希望它能像这样工作 >>> function() number: 3 6 >>> function() number: x 2*x >>> function() number: a 2*a 我想提示用户输入的原因是,我考虑的函数有很多参数。我也在考虑在方程中使用它,比如'f(x)+g(y)=h(z'),所以如果变量可以赋值而不是固定的话,它会
(来源:)
那我希望它能像这样工作
>>> function()
number: 3
6
>>> function()
number: x
2*x
>>> function()
number: a
2*a
我想提示用户输入的原因是,我考虑的函数有很多参数。我也在考虑在方程中使用它,比如'f(x)+g(y)=h(z'),所以如果变量可以赋值而不是固定的话,它会很有用
2.以下是我试过但没用的。肯德尔的回答解释了原因 我首先制作了一个模块 tweep.py:
def twice():
num = input('number: ')
return 2*num
然后我运行它
>>> import sympy as s
>>> x = s.var('x')
>>>
>>> import twice as t
>>> t.twice()
number: x
NameError: name 'x' is not defined
在模块中导入时,
tweeps()
在模块的全局命名空间中运行,并且无权访问交互式会话的全局变量,例如x
。毕竟,这就是模块的全部意义所在
这通常通过将变量传递给函数而不是让它们对全局变量进行操作来纠正
与Symphy没有任何关系,如果您使用常规的ol'Python数字或其他任何东西,您也会遇到同样的问题。您可能应该这样做: 我的建议: 这并不完全是你想要的方式,但它让事情变得简单和抽象。num是simpy变量、int、float还是list都无关紧要。。。如果它是一个数值对象,将对其应用两次*2。您可以在一个库中安全地使用两次 两次
def twice(num):
return 2*num
import sympy as s
def fetch_input():
userInput = raw_input('number: ')
try:
return int(userInput)
except ValueError:
return s.var(userInput)
def twice():
num = fetch_input()
return 2*num
控制台
>>> import sympy as s
>>> x = s.var('x')
>>>
>>> import twice as t
>>> t.twice(x)
对于有用户输入的版本:
这里有一个有效的解决方案。您不应该使用它,因为您在函数中混合了io和功能。这很糟糕
两次
def twice(num):
return 2*num
import sympy as s
def fetch_input():
userInput = raw_input('number: ')
try:
return int(userInput)
except ValueError:
return s.var(userInput)
def twice():
num = fetch_input()
return 2*num
当提示用户输入时,原始输入通常是最好的。它返回字符串,而不是尝试求值表达式。传递变量是否意味着
def function(arg):
?有什么方法可以让它保持交互吗?是的,def function(arg)
。为了“保持交互”,让主脚本执行input()
,并将结果传递给函数。您能提供实际的代码吗?我不知道该如何处理你的建议…你知道如何保持互动吗?这个版本有什么不互动的?我很模糊。我的意思是“提示用户输入”。我还在第1部分的末尾添加了一些评论,请看一下。是否可以使它同时适用于数字(评估)和变量(替换)?我不喜欢weis26正在做什么。但是我认为在fetch\u input
函数中使用returns.sympify(userInput)
会更好。这应包括最可能的输入。例如,不会将浮点值舍入为整数。不要在Python2.x中使用input
!!它是不安全的:它相当于eval(raw\u input())
,因此它可以计算代码。改用raw\u input()
。