1

1.我想在模块中定义一个交互的函数,也可以接受符号变量。

假设函数是


(来源:texify.com

然后我希望它像

>>> function()
number: 3
6
>>> function()
number: x
2*x
>>> function()
number: a
2*a

我想提示用户输入的原因是我正在考虑具有许多参数的函数。我也在考虑在诸如“f(x)+g(y)=h(z)”之类的方程中使用它,所以如果可以分配变量而不是固定变量,这将很有用。


2.这是我试过的,但没有用。肯德尔的回答解释了原因。

我首先做了一个模块。

两次.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
4

2 回答 2

2

当您在模块中导入它时,twice()它在模块的全局命名空间中运行,并且无权访问交互式会话的全局变量,例如x. 毕竟,这就是模块的全部意义所在。

这通常通过将变量传递给函数而不是让它们对全局变量进行操作来纠正。

与 没有任何关系sympy,如果您使用常规的 ol' Python 数字或其他任何东西,您会遇到同样的问题。

于 2011-10-28T04:35:13.803 回答
1

您可能应该以这种方式工作:

我推荐的:

这并不完全按照您想要的方式工作,但它使事情变得简单和抽象。如果 num 是 simpy 变量、int、float、list 都没有关系……如果它是数字对象,两次将应用 *2 到它。您可以安全地在一个库中使用两次。

两次.py

def twice(num):
    return 2*num

安慰

>>> import sympy as s
>>> x = s.var('x')
>>>
>>> import twice as t
>>> t.twice(x)

对于带有用户输入的版本:

这是一个有效的解决方案。您不应该使用它,因为您在函数中混合了 io 和功能。哪个不好。

两次.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 通常是最好的。它返回一个字符串,而不是尝试评估一个表达式。

于 2011-10-28T08:08:37.350 回答