Почему sympy.simplify не делает арифметику с дробями в python так, как это показано в документации? - PullRequest
0 голосов
/ 08 июня 2018

Я хотел бы сделать арифметику для дробей и получить результаты как уменьшенные дроби.Например, я хочу, чтобы 1/4 + 1/16 вышло как 5/16.И затем я хотел бы использовать этот результат для дальнейших вычислений.Например, я хотел бы иметь возможность добавить 1 к 5/16 и получить 21 / 16.

Я попробовал 2 подхода, и ни один не был удовлетворительным.

Первый подход состоял в использованииfraction.Fraction.Здесь я получил следующее

In [12]: from fractions import Fraction

In [13]: Fraction(1/4+1/16)
Out[13]: Fraction(5, 16)

Очевидно, что Fractions знает, что делает, но не будет отображать результат как 5 / 16.

Тогда, как предложено в

добавление двух дробей в python

Я мог бы получить 5/16, напечатав Fraction (1/4 + 1/16), как в


In [187]: print(Fraction(1/4+1/16))
5/16

Однако это 5/16 предназначено только для отображения, поскольку оно не имеет типа

In [188]: type(print(Fraction(1/4+1/16)))
5/16
Out[188]: NoneType

и не может использоваться в дальнейших вычислениях

In [190]: print(Fraction(1/4+1/16)) + 1
5/16
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-190-87b52dc30510> in <module>()
----> 1 print(Fraction(1/4+1/16)) + 1

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Таким образом, этот подход представляется тупиком.

Мой второй подход состоял в том, чтобы использовать sympy.simplify

На странице документации для упрощения,

http://docs.sympy.org/latest/tutorial/simplification.html#simplify

есть SymPy Live Shellэто можно использовать для экспериментов с упрощением.

Когда я ввожу упрощение (1/4 + 1/16) в Live Shell, я получаю

 5
 -
 16

, что именно то, что я хочу.

Более того, когда я запускаю упростить (1/4 + 1/16) + 1 в Live Shell, я получаю

21
--
16 

Так что упрощение, кажется, делает то, что я хочу.

Однако, когда я запускаю упростить (1/4 + 1/16) в ipython с python 3.6, я получаю

In [139]: simplify(1/4+1/16)
Out[139]: 0.312500000000000

Так что я получаю правильный ответ, но я не получаю дробный вывод, которыйLive Shell дал мне.

Почему поведение ipython отличается от поведения SymPy Live Shell?И есть ли другой способ получить то, что я хочу?

...