#python
Вопрос:
Приведенный ниже код выводит упрощенную дробь. Но я хочу не упрощенный вариант. Пример: Если ответ 2/4, я хочу, чтобы код возвращал 2/4, а не 1/2.
from fractions import Fraction
def frac(n,d):
print(Fraction(n/d))
фракция(2,4) дает 1/2.
from fractions import Fraction
def frac(n,d):
return(Fraction(n/d))
frac(2/4)
дает Fraction(1,2)
Чего я хочу, так это вернуть ( Fraction(n/d)
), чтобы отдать 2/4
.
Как мне добиться этого в python?
Комментарии:
1. Создайте свой собственный класс?
2. Почему это имеет для тебя значение? Объективно,
2/4 === 1/2
. Если вам нужны исходные значения, отслеживайте их в отдельной структуре данных или подклассеFraction
, чтобы сделать это за вас.3.
fractions.Fraction
представляет собой рациональные числа, а не числитель и знаменатель. Это похоже на то, какint
не представляет ведущие нули, потому что оно представляет целое число, а не последовательность цифр.4. Также никогда не делайте
Fraction(n/d)
этого . Это делает плавающую арифметику. ВоспользуйсяFraction(n, d)
.5. Несколько человек опубликовали ответы, используя параметр без документов
_normalize
. Не используй это. Он не предназначен для публичного использования, и если вы его попробуете, то все действительно сломается , начиная от неправильных математических результатов и заканчивая ложными ошибками обнуления. Вот пример неправильного математического результата , а вот пример ложного исключения .
Ответ №1:
Сначала давайте разберемся, что здесь происходит, а затем посмотрим, как это изменить.
У вас есть два разных вопроса/проблемы в этом одном вопросе.
Часть 1: Как получить «1/2» вместо «Дробь(1,2)»
Когда вы печатаете дробь, она сначала преобразуется в строку, и это возвращает нужный вам тип вывода. Если вы просто выводите дробь на консоль (что происходит при вызове функции из REPL), вместо этого она преобразуется в строку с помощью repr()
str(Fraction(2/4)) --> "1/2"
repr(Fraction(2/4)) --> "Fraction(1, 2)"
Итак, во-первых, если вы хотите вернуть дробь в виде строки, перед return
тем, как вам нужно будет привести ее к строке:
def frac(n,d):
return str(Fraction(n/d))
Часть 2: Не нормализуйте дробь
Ты сказал, что хочешь frac(2,4)
вернуть "2/4"
и не "1/2"
хочешь . Давайте посмотрим, что происходит в вашем коде:
Fraction(n/d)
Поскольку вы передаете n/d
значение в качестве параметра Fraction()
, деление будет выполнено первым, еще до того, как значение перейдет в Fraction()
. Чтобы сделать этот момент более ясным, давайте выполним инструкцию кода за инструкцией:
n=2
d=4
2/4 -> 0.5
Fraction(0.5)
Как вы видите, вы передаете разделенный результат Fraction()
, поэтому Fraction()
узнать делитель невозможно.
Но даже передача числителя и делителя в качестве отдельных параметров вам не поможет, поскольку дробь представляет собой нормализованную дробь.
Вот как работает этот класс.
Ответ №2:
Вы можете вернуть кортеж из числителя и знаменателя дроби, например (n, d), или в виде строки «1/2». Другого пути нет
Ответ №3:
Создание класса и подходящих функций может сработать.
class frac():
def __init__(self,num,den):
self.num = num
self.den = den
def decimal(self):
return self.num / self.den
Что — то в этом роде.