有没有办法让"可变"的分数? - 蟒蛇

alv*_*vas 2 python generator mutable fractions

有没有办法让"可变" Fraction

我试过这个,但看起来像Fraction中的分子/分母是不可变的.

>>> from fractions import Fraction
>>> x = Fraction(0,1)
>>> numerators = [1,2,3,4,5]
>>> denominators = [9,8,7,6,5]
>>> for n,d in zip(numerators, denominators):
...     x.numerator+= n
...     x.denominator+= d
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AttributeError: can't set attribute
Run Code Online (Sandbox Code Playgroud)

我一直在这样做,因为我的分子/分母来自另一个返回分数生成器的函数.

>>> inputs = [Fraction(1,9), Fraction(2,8), Fraction(3,7), Fraction(4,6)]
>>> numerators, denominators = zip(*[(f.numerator, f.denominator) for f in inputs])
>>> x = Fraction(sum(numerators), sum(denominators))
>>> x
Fraction(7, 23)
Run Code Online (Sandbox Code Playgroud)

(注意,我没有添加1/9 + 2/8 + 3/7 + 4/6,我试图将分子相加并除以分母的总和)

是否存在"可变"分数?

use*_*342 5

由于两个原因numerator,denominator它们是不可变的:

  1. 其他Python数值类型是不可变的,包括复数,也包括两个更简单的数值,以及任意宽度的数量,如longDecimal.可变分数将是一个例外.

  2. 能够单独改变分子和分母将有可能使分数无效,例如通过使其非规范化,或者通过将分母设置为零.

换句话说,没有用于改变fractions.Fraction对象的公共API .如果你真的需要一个单独的分子和分母的总和,这听起来不是很有用,你的第二个代码片段是一个合理的方法.第一个片段的更精确的再现可能如下所示:

x = Fraction(sum(f.numerator for f in inputs),
             # add 1 since we start out with 0/1
             1 + sum(f.denominator for f in inputs))
Run Code Online (Sandbox Code Playgroud)