1

我正在处理python中处理有理数的问题,它有一种简化它的方法。例如12/8给出3/2. 我已经完成了这个问题并得到了正确的答案,但是我通过找到分子和分母的 gcd 来完成。当您说“Pythonic 方式!”时,可能有人帮助使用一些内置的特殊 python 特性或函数、模块或 python 独有的任何东西来完成它。

是否有这样的方法或应该包含任何测试用例来涵盖所有可能性?

这是我的代码:

class RationalNumber:
def __init__(self, n, d=1):
    self.n=n
    self.d=d

'''def gcd(self, a, b): // I have taken out gcd by two methods: recursion and while loop
    if b>a:
        t=a
        a=b
        b=t

    while a%b != 0:
        r=a%b
        a=b
        b=r

    return b
    '''

def gcd(self, a, b):
    if a%b==0:
        return b
    else:
        return self.gcd(b, a%b)

def simplify(self):
    x=self.gcd(self.n, self.d)
    self.n=self.n/x
    self.d=self.d/x

    return RationalNumber(self.n, self.d)

def __str__(self):
    print "%s/%s"%(self.n, self.d)

r1 = RationalNumber(12,8)
print r1.simplify()

当我运行程序时,它会给出答案并给出错误:

Traceback (most recent call last):
  File "C:\Python27\CTE Python Practise\New folder\RationalNumberSimplify.py", line 42, in <module>
    print r1.simplify()
TypeError: __str__ returned non-string (type NoneType)

请帮助我消除错误并改进代码并使其更加pythonic!

4

2 回答 2

5

有一种更 Pythonic 的方式可以做到这一点。

fractions 模块有一个 gcd() 函数,但你很可能不需要它,因为 Fraction 类应该做你想做的一切。

>>> import fractions
>>> print fractions.Fraction(12, 18)
2/3
于 2013-09-26T12:01:13.397 回答
1

使用@stranac 提到的分数模块。至于您关于错误的其他问题,可以通过将方法替换__str__

def __repr__(self):
    return "%s/%s"%(self.n, self.d)

对于任何一个,__str__或者__repr__您需要返回一个字符串而不是简单地打印出来。查看以下问题可能会有所帮助:

Python 中 __str__ 和 __repr__ 的区别

于 2013-09-26T13:53:05.003 回答