有没有办法得到“可变”分数?python

2024-04-27 19:34:19 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法让“可变”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

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

^{pr2}$

(请注意,我不是在加1/9 + 2/8 + 3/7 + 4/6,我是想把分子和除以分母之和)

是否存在“可变”分数?


Tags: infromimportforzip分子分数办法
2条回答

有趣的想法,但可以用一些简单的数学来解决:

>>> x = Fraction(0,1)
>>> numerators = [1,2,3,4,5]
>>> denominators = [9,8,7,6,5]
>>> for n,d in zip(numerators, denominators):
...     x += Fraction(n,x.denominator) # "Adding" to the numerator is adding a new fraction.
...     x = x/d # "adding" to the denominator is just dividing by the operand

你可以see this in practice here。在


正如我在评论中所暗示的,但是user4815162342说得更清楚,Fractions是不可变的,因为分数是不可变的,就像{}是不可变的,因为整数的概念是不可变的。在

7是7是'seven'是7,因此为一个不可变的想法创建一个可变的对象是没有意义的。很像3/4是0.75是“四分之三”,不管你怎么定义它,这个想法都是一样的,所以让一个表示静态概念的对象是可变的是没有意义的。在

有意义的是用数学来修正它们的3/4,分母现在是8,这不是一件事。分数的加法或乘法更直观。在

由于两个原因,numerator和{}是不可变的:

  1. 其他Python数字类型是不可变的,包括同样由两个更简单的数值组成的复数,以及任意宽度的数量,如long和{}。可变分数是个例外。

  2. 能够单独突变分子和分母将有可能使分数无效,例如使其非标准化,或将分母设置为零。

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

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

相关问题 更多 >