有没有一种方法可以让你;可变的;分数?-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
,而是在尝试对分子求和,然后除以分母之和)
是否存在“可变”分数?分子和分母是不可变的,原因有二:
long
和Decimal
。可变分数是个例外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