在我的程序中使用“from __future__ import division”,但它没有加载我的程序

时间:2011-11-28 01:36:10

标签: python sympy

我在Python 2中编写了以下程序来为我的数学问题集进行Newton的方法计算,虽然它完美地工作,但出于我不知道的原因,当我最初使用%run -i NewtonsMethodMultivariate.py在ipython中加载它时,Python 3师不进口。我知道这是因为在加载我的Python程序后,输入x**(3/4)会给出“1”。手动导入新部门后,x**(3/4)仍为x**(3/4),符合预期。这是为什么?

# coding: utf-8
from __future__ import division
from sympy import symbols, Matrix, zeros

x, y = symbols('x y')
X = Matrix([[x],[y]])
tol = 1e-3

def roots(h,a):
  def F(s):
    return h.subs({x: s[0,0], y: s[1,0]})
  def D(s):
    return h.jacobian(X).subs({x: s[0,0], y: s[1,0]})
  if F(a) == zeros((2,1)):
    return a
  else:
    while (F(a)).norm() > tol:
      a = a - ((D(a))**(-1))*F(a)
      print a.evalf(10)

我会使用Python 3来避免这个问题,但我的Linux发行版只提供SymPy for Python 2.感谢任何人都能提供的帮助。

另外,如果有人想知道,我还没有为nxn Jacobians推广这个脚本,只需在我的问题集中处理2x2。 此外,我正在切割2x2零矩阵而不是使用命令zeros(2,1),因为我的机器上安装的SymPy 0.7.1抱怨“zeros()只接受一个参数”,尽管{{ 3}}否则建议。也许这个命令只适用于git版本。(感谢eryksun纠正我的符号,用零函数修复了这个问题。)

2 个答案:

答案 0 :(得分:12)

ipython -i解释器中的run -i命令和ipython都忽略了from __future__ import division脚本中的print05.py

$ cat print05.py 
from __future__ import division
print(1/2)

ipython控制台中:

In [1]: print 1/2
0
In [2]: run -i print05.py
0.5
In [3]: division
Out[3]: _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
In [4]: print 1/2
0
In [5]: from __future__ import division
In [6]: print 1/2
0.5

execfileimport会产生相同的结果:

>>> print 1/2
0
>>> execfile('print05.py')
0.5
>>> print 1/2
0
>>> from __future__ import division
>>> print 1/2
0.5

from __future__ import division不应该对来自不同模块的源代码产生影响,否则会破坏其他不期望其存在的模块中的代码。

此处from __future__ import division有效:

$ python -i print05.py
0.5
>>> print 1/2
0.5
>>> division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)

在这种情况下,模块名称__main__位于print05.py内和提示符中。

此处,第一个print 1/2print05模块中执行,第二个在__main__模块中执行,因此它也按预期工作:

$ python -im print05
0.5
>>> print 1/2
0

这是错误的:

$ ipython -i print05.py
0.5
In [1]: division
Out[1]: _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
In [2]: print 1/2
0

__future__的文档说:

  

如果使用-i选项启动解释器,则传递脚本   要执行的名称,并且脚本将包含将来的语句   在脚本之后启动的交互式会话中生效   执行。

如果ipython选项试图模拟相同的python选项,那么它可能是-i中的错误。

答案 1 :(得分:0)

SymPy还提供了一个脚本 - isympy - 它是IPython的包装器,它执行一些常用命令,包括从未来导入分区。它非常方便,在较新的IPython版本(0.11 +)中它还允许自动构造符号(这总是很好,因为我似乎总是忘记);使用-a参数运行它。

对于Python 3,在开发版本中支持它,下一个版本将拥有它;当分发打包时,我不知道。