1.我想在一个交互式模块中定义一个函数,也可以使用符号变量。
假设功能是
http://www.texify.com/img/%5CLARGE%5C%21f%28x%29%5C%20%3D%5C%202x.gif
然后我希望它像
一样工作>>> function()
number: 3
6
>>> function()
number: x
2*x
>>> function()
number: a
2*a
我想提示用户输入的原因是我正在考虑具有许多参数的函数。我也想在像`f(x)+ g(y)= h(z)'这样的方程式中使用它,所以如果可以分配变量而不是固定变量将会很有用。
2.这是我尝试过的不起作用的东西。肯德尔的回答解释了原因。
我首先制作了一个模块。
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
答案 0 :(得分:2)
在模块中导入时,twice()
在模块的全局命名空间中运行,并且无法访问交互式会话的全局变量,例如x
。毕竟,这就是模块的重点。
这通常通过将变量传递给函数而不是让它们对全局变量进行操作来纠正。
与sympy
没有任何关系,如果您使用常规的'Python数字或其他任何内容,则会遇到同样的问题。
答案 1 :(得分:1)
你应该以这种方式工作:
我的建议:
这不能完全按照你想要的方式工作,但它保持简单和抽象。如果num是一个简单的变量,一个int,一个浮点数,一个列表......如果它是一个数字对象,则两次将* 2应用于它是无关紧要的。您可以安全地在lib中使用两次。
twice.py
def twice(num):
return 2*num
控制台
>>> import sympy as s
>>> x = s.var('x')
>>>
>>> import twice as t
>>> t.twice(x)
用于具有用户输入的版本:
这是一个有效的解决方案。你不应该使用它,因为你在你的功能中混合了io和功能。这很糟糕。
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通常是最佳的。它返回一个字符串,而不是试图评估一个表达式。