从脚本中输入符号 [sympy]
1. 我想在一个模块里定义一个可以互动的函数,并且这个函数还可以接受符号变量。
假设这个函数是
(来源: texify.com)
。
然后我希望它能像这样工作
>>> function()
number: 3
6
>>> function()
number: x
2*x
>>> function()
number: a
2*a
我想要提示用户输入的原因是,我在考虑有很多参数的函数。我还想用它来处理像 `f(x)+g(y)=h(z)` 这样的方程,所以如果变量可以被赋值而不是固定的,那就会很有用。
2. 这是我尝试过但没有成功的做法。原因在kendall的回答中有解释。
我首先创建了一个模块。
twice.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
2 个回答
1
你可以这样来做:
我推荐的做法:
这并不是完全按照你想要的方式工作,但它保持了简单和抽象。无论num是一个简单的变量、整数、浮点数还是列表,只要它是一个数字对象,twice函数就会对它乘以2。你可以安全地在库中使用twice。
twice.py
def twice(num):
return 2*num
控制台
>>> import sympy as s
>>> x = s.var('x')
>>>
>>> import twice as t
>>> t.twice(x)
如果需要用户输入的版本:
这里有一个可用的解决方案。不过你不应该使用它,因为你把输入输出和功能混在了一起,这样不好。
twice.py
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
通常情况下,raw_input在提示用户输入时是最好的选择。它会返回一个字符串,而不是试图去计算一个表达式。
2
当你在一个模块中导入它时,twice()
函数是在模块自己的全局命名空间中运行的,它无法访问交互式会话中的全局变量,比如 x
。这就是模块的主要目的。
通常可以通过将变量传递给函数来解决这个问题,而不是让函数直接操作全局变量。
这和 sympy
完全没有关系,如果你使用普通的 Python 数字或者其他东西,也会遇到同样的问题。