首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3:分数

Python3:分数
EN

Stack Overflow用户
提问于 2021-01-02 19:55:24
回答 1查看 29关注 0票数 0
代码语言:javascript
复制
from fractions import Fraction
from functools import reduce

def product(fracs): ## fracs is a list of Fraction objects from the subsequent function call
    t = Fractions(reduce(lambda x,y: x.numerator * y.numerator,fracs), reduce(lambda x,y: x.denominator * y.denominator, fracs))
    return t.numerator, t.denominator

if __name__ == '__main__':
    fracs = []
    for _ in range(int(input())):
        fracs.append(Fraction(*map(int, input().split())))
    result = product(fracs)
    print(*result)

我正在尝试使用Python3函数工具的分数函数将一系列分数相乘。我遇到的问题是product(fracs)函数中t变量的分母边界。在使用以下测试用例进行测试时:

代码语言:javascript
复制
3
1 2
3 4
10 6
5 1

输出是5 1。分子似乎工作得很好,但分母的情况却不太好。我意识到并找到了解决我的问题的替代方案,但我希望这个谜团能得到解答。我已经通过python tutor运行了它,但我无法破译代码的行为。

EN

回答 1

Stack Overflow用户

发布于 2021-01-02 20:59:24

我认为这就是你使用reduce的方式。第一次调用它时,您传递的是两个Fraction对象:

代码语言:javascript
复制
Fraction(1,2).denominator * Fraction(3,4).denominator

它返回8,这是您所期望的。但是,reduce函数并没有将这个8设为小数,因此下一次对reduce的调用如下所示:

代码语言:javascript
复制
8.denominator * Fraction(10,6).denominator

这是6,而不是预期的48。分子不存在此问题,因为对于Int X:

代码语言:javascript
复制
X = X.numerator

因此,你在分子中得到30,在分母中得到6,这就减少到5。

我不熟悉Fraction类,但看起来您可能是在重新发明轮子。

我怀疑你可以将分数对象相乘,但它的乘法操作符是重载的:

代码语言:javascript
复制
def product(fracs):
  return reduce(lambda x,y: x * y, fracs)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65538814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档