Использование «из __future__ import Division» в моей программе, но оно не загружается с моей программой - PullRequest
17 голосов
/ 28 ноября 2011

Я написал следующую программу на Python 2, чтобы выполнять вычисления метода Ньютона для моего набора математических задач, и хотя он работает отлично, по незаметным для меня причинам, когда я первоначально загружаю его в ipython с %run -i NewtonsMethodMultivariate.py, подразделение 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 для Python 2. Благодаря помощи, которую может предоставить любой.

Кроме того, на случай, если кому-то интересно, я еще не обобщил этот сценарий для nxn Jacobians, и мне пришлось иметь дело только с 2x2 в моем наборе задач. Кроме того, я нарезаю нулевую матрицу 2x2 вместо использования команды zeros(2,1), потому что SymPy 0.7.1, установленный на моей машине, жалуется, что "zeros () принимает ровно один аргумент", хотя вики предполагает иное. Может быть, эта команда только для версии git. (Спасибо, eryksun, за исправление моей записи, которая исправила проблему с функцией нулей.)

Ответы [ 2 ]

12 голосов
/ 28 ноября 2011

Обе команды 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

execfile и import дают одинаковый результат:

>>> 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/2 выполняется в модуле print05, второй - в модуле __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, если его опция -i пытается эмулировать тот же параметр python.

0 голосов
/ 28 ноября 2011

SymPy также предоставляет скрипт isympy, который является оболочкой для IPython, который выполняет некоторые общие команды, включая импорт деления из будущего.Это довольно удобно, и в более новых версиях IPython (0.11+) также позволяет автоматически создавать символы (что приятно, как я всегда забываю);запустите его с параметром -a.

Что касается Python 3, то есть поддержка в версии для разработчиков, и в следующем выпуске она будет;когда дистрибутивы собираются упаковать это, я не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...