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,我试图将分子相加并除以分母的总和)
是否存在"可变"分数?
由于两个原因numerator,denominator它们是不可变的:
其他Python数值类型是不可变的,包括复数,也包括两个更简单的数值,以及任意宽度的数量,如long和Decimal.可变分数将是一个例外.
能够单独改变分子和分母将有可能使分数无效,例如通过使其非规范化,或者通过将分母设置为零.
换句话说,没有用于改变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)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |