Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中导入变量?_Python_Import_Sympy - Fatal编程技术网

在Python中导入变量?

在Python中导入变量?,python,import,sympy,Python,Import,Sympy,我正在使用sympy编写上标,使用pretty\u print命令。为了使pretty_print命令能够工作,需要将其与一些变量(代数(x、y等)一起导入。如果不从sympy.abc导入变量(代数),则需要将字母放在引号'中,而在引号中,pretty\u print命令将不起作用 例如,如果我在屏幕上打印x²,我需要导入x,以便在程序中使用。像这样: import sympy from sympy import pretty_text as exp from sympy.abc im

我正在使用sympy编写上标,使用
pretty\u print
命令。为了使pretty_print命令能够工作,需要将其与一些变量(代数(x、y等)一起导入。如果不从sympy.abc导入变量(代数),则需要将字母放在引号
'
中,而在引号中,pretty\u print命令将不起作用

例如,如果我在屏幕上打印
,我需要导入
x
,以便在程序中使用。像这样:

import sympy  
from sympy import pretty_text as exp   
from sympy.abc import x

equation= x**2

exp(equation)
这将在屏幕上打印x²。问题是如果我给x赋值,那么它将不再等于它本身。如果我在从symphy.abc导入后直接打印x,它会执行以下操作-

(假装这是空闲的)>

但是,如果是x 1

>>> import sympy  
>>> from sympy import pretty_text as exp   
>>> from sympy.abc import x

>>> x
x 
>>> x = 1
>>>x
1
然后我需要再次平方
x

>>> import sympy  
>>> from sympy import pretty_text as exp   
>>> from sympy.abc import x

>>> x
x 
>>> x = 1
>>>x
1 
>>> equation = x**2
>>> exp(equation)
1
它将正好是平方1。即使它再次尝试使
x='x'
,它也不一样,因为它周围将有
'
。我只能通过再次导入来修复此问题。然而,在我的程序中,我可能需要再次导入任何字母,所以我需要导入一个变量。我试过了

from sympy.abc import x[0]
但这是无效的。那么,有什么方法可以导入不同的字母吗?

如果您这样做:

import sympy.abc
x = sympy.abc.x
然后,无论何时需要原始值,只要使用
sympy.abc.x
。如果需要动态获取名称:

getattr(sympy.abc, "x")

其中文字可以替换为任何变量。

如果要保留符号,请不要为其指定任何值-继续使用符号,直到您真正需要解决方案

例如:

In [15]: equation=sympy.sin(x**2)

In [16]: exp(equation)
   ⎛ 2⎞
sin⎝x ⎠

In [17]: result = equation.subs({'x': 2})

In [18]: result
Out[18]: sin(4)

In [19]: result.evalf()
Out[19]: -0.756802495307928
这不会改变
x
本身-稍后:

In [23]: exp(sympy.log(x**.5))
   ⎛ 0.5⎞
log⎝x   ⎠

只要需要,就以符号形式保留您的方程式,不要担心值本身。

您不需要在SymPy中导入符号名称。abc模块只是为了方便使用一个字母的符号名称

只需使用您想要的任何名称创建Symbol对象(可以是任何字符串,包括动态创建的字符串)

还请注意,您为符号指定的名称与保存该符号的Python变量的名称不必相关。实际上,一个符号并不知道它绑定到什么Python变量名(这是Python中的一切工作方式,而不仅仅是Symphy)

您还可以使用
符号
一次创建多个符号

>>> x, y, z = symbols('x y z')

我理解您使用x=sympy.abc.x的第一部分,但是您能解释一下getattr(sympy.abc,“x”)如何将其用于变量吗?@Nick
getattr()
是一个内置的从对象获取属性的函数,因此如果您有一个具有
名称
属性的类实例,
inst.name
完全等同于
getattr(inst,“name”)
-模块的工作方式相同
getattr(symphy.abc,“x”)
是编写
symphy.abc.x
的另一种方法,除了
“x”
可以是任何变量,允许您动态获取不同的属性。我尝试过测试,当我尝试将“x”设置为变量时,它说属性必须是字符串。那么,如何使用此函数动态更改要导入的字母?@Nick该变量需要包含要导入的变量的名称,因此如果要导入变量
sympy.abc.z
,请将该变量传递给
getattr()
需要包含值
'z'
。为什么我收到了一个-1?在引号中加上x将创建一个字符串,它是一个与符号完全不同的对象。在您的问题中存在许多误解。读取并查看是否清除了某些内容(尤其是变量部分)。此命令是从Symphy导入的吗?当我从Symphy导入它并尝试此操作时,我得到一个错误,即对象不可调用。是的,
Symbol
symbols
都是从Symphy导入的。
>>> x = Symbol('x')
>>> x
x
>>> x = Symbol('y')
>>> x
y 
>>> x, y, z = symbols('x y z')