取分数的倒数

问题描述

我想在 python 中取 Fraction 的倒数,并就地进行。 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)

这确实有效,但创建一个新对象并删除旧对象似乎不是很“pythonic”,即不必要的复杂。有没有更好的取反方法

解决方法

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))
,

我认为f**-1这会完成工作

,

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)