从脚本中输入符号 [sympy]

1 投票
2 回答
2234 浏览
提问于 2025-04-17 05:09

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 数字或者其他东西,也会遇到同样的问题。

撰写回答