Я хочу взять обратную величину Fraction в Python и сделать это на месте. Класс Fraction не предоставляет метода для этого (насколько мне известно). Я попытался просто поменять местами числитель и знаменатель:

f = Fraction(2, 3)
f.numerator, f.denominator = f.denominator, f.numerator

Но это привело к AttributeError: can't set attribute.

Я также использовал метод создания нового Fraction:

f = Fraction(2, 3)
f = Fraction(f.denominator, f.numerator)

Что на самом деле работает, но создание нового объекта и удаление старого не кажется очень «питоническим», т.е. излишне сложным. Есть ли лучший способ получить ответ?

1
dranjohn 16 Янв 2021 в 20:37

3 ответа

Лучший ответ
from fractions import Fraction

spam = Fraction(2, 3)
eggs = spam ** -1
print(repr(eggs))

Выход

Fraction(3, 2)

РЕДАКТИРОВАТЬ: Как указано в комментариях @martineau 1 / spam, также работает:

from fractions import Fraction

spam = Fraction(2, 3)
eggs = 1 / spam 
print(repr(eggs))
2
buran 16 Янв 2021 в 18:23

Я думаю f**-1 это сработает

2
Suraj S 16 Янв 2021 в 17:42

Fractions неизменны, как и многие (все?) Числа Python, поэтому вы не можете изменять их атрибуты. Обходной путь - определить функцию, которая создает и возвращает новые экземпляры класса на основе атрибутов переданного ему. Ниже показаны два способа сделать это.

from fractions import Fraction


def reciprocal(f):
    """ Return reciprocal of argument (an instance of Fraction). """
    return Fraction(f.denominator, f.numerator)

# Alternative implementation.
reciprocal = lambda f: Fraction(f.denominator, f.numerator)


f = Fraction(2, 3)
print(f)  # -> 2/3
print(repr(f))  # -> Fraction(2, 3)
r = reciprocal(f)
print(r)  # -> 3/2
print(repr(r))  # -> Fraction(3, 2)

1
martineau 16 Янв 2021 в 18:07
65752614