有没有一种方法可以让你;可变的;分数?-python

有没有一种方法可以让你;可变的;分数?-python,python,generator,mutable,fractions,Python,Generator,Mutable,Fractions,有没有一种方法可以获得“可变的”分数?? 我试过了,但分数中的分子/分母似乎是不可变的 >>> 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)

有没有一种方法可以获得“可变的”
分数?

我试过了,但分数中的分子/分母似乎是不可变的

>>> 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
(请注意,我不是在添加
1/9+2/8+3/7+4/6
,而是在尝试对分子求和,然后除以分母之和)


是否存在“可变”分数?

分子和分母是不可变的,原因有二:

  • 其他Python数值类型是不可变的,包括也由两个简单数值组成的复数,以及任意宽度的数量,如
    long
    Decimal
    。可变分数是个例外

  • 能够单独变异分子和分母可能会使分数无效,例如通过使其非规范化,或通过将分母设置为零

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

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

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

    >>> 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
    
    你可以


    正如我在评论中所暗示的,但user4815162342更清楚地表明,
    分数是不可变的,因为分数是不可变的,就像
    整数
    是不可变的,因为整数的概念本身是不可变的

    7是7是“7”是
    7
    ,因此为一个不变的想法创建一个可变的对象是毫无意义的。很像
    3/4
    is 0.75是“四分之三”,无论你如何定义它,想法都是一样的,所以让一个表示静态概念的对象可变是没有意义的


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

    CPython 3.9.2非公共API:

    >>> 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
    >>> print(x)
    15/36
    
    请小心,因为这是一种非公开的方式,将来可能会改变


    有可变整数吗?但整数没有分子/分母,这是分数吗?分数?我看不到任何导入。但分子/分母对只是表示数字线上某个点的精确方式。此外,整数不就是分母
    1
    的分数吗?这不就是分母的乘积吗?也就是说,你找到的不是
    (a+b)/(c+d)
    ,而是
    (a+b)/(c*d)
    @Blckknght是的,你是对的,我刚刚意识到。。。让我看看我能想出什么。@pat你能详细说明一下吗?OP的代码示例将累加器
    x
    初始化为
    分数(0,1)
    。好吧,OP的第二个示例没有,因为0/1=0/42=0/x,其中x!=0,您可以选择任何非零分母开始。。。它只是表明,将分子和分母相加会得到一个毫无意义的结果。@pat是的,我不明白为什么会有人想将分子和分母相加。回答这个问题的有趣部分是试图解释为什么分数是不可变的,以及这如何不是实现请求的真正障碍,尽管这很奇怪。
    >>> 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
    >>> print(x)
    15/36