如何在return语句中调用另一个本地函数内的本地函数?

时间:2014-03-01 12:17:46

标签: python python-2.7 python-3.x

当我运行类Fraction时,未定义全局名称简化是我得到的错误。虽然我在同一类Fraction中定义了简化函数。独立运行时的简化功能运行完美。 Fraction类在没有简化函数的情况下运行时,返回的答案未按预期简化。当我尝试在添加后简化分数后会出现什么问题?

class Fraction:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    #simplify, simplifies the fraction.(2/4 to 1/2)
    #add, adds two fractions and then returns the simplified fraction.
    def __add__ (self, f):
        if (self.b == f.b) :
            return simplify(Fraction(self.a + f.a , f.b))
        else :
            pro = self.b * f.b
            return simplify(Fraction(self.a * f.b + f.a * self.b , pro))

2 个答案:

答案 0 :(得分:1)

由于simplify是本地函数,因此您应该使用语法Class.function。 试图简单地运行,解释器将寻找全局simplify函数。

以下是您应该尝试的内容:

class Fraction:
    def __init__(self, a, b):
        self.a = a
        self.b = b

#simplify, simplifies the fraction.(2/4 to 1/2)
#add, adds two fractions and then returns the simplified fraction.
    def __add__ (self, f):
        if (self.b == f.b) :
            return Fraction.simplify(Fraction(self.a + f.a , f.b))
        else :
            pro = self.b * f.b
            return Fraction.simplify(Fraction(self.a * f.b + f.a * self.b , pro))

希望有所帮助

答案 1 :(得分:0)

您正在混合功能和方法。

一个函数看起来像f(a, b)。方法看起来像<class instance>.method(a, b)

看看这个(我使用Python fractions模块来简化'简化'):

import fractions

class MyFraction:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def simplify(self):
        rtr=fractions.Fraction(self.a, self.b)
        print('"simplify({}, {})"={}'.format(self.a,self.b, rtr))    
        return rtr

    #simplify, simplifies the fraction.(2/4 to 1/2)
    #add, adds two fractions and then returns the simplified fraction.
    def __repr__(self):
        return '{}/{}'.format(self.a, self.b)

    # alternatively, if you want to always print a simplified fraction:
    # def __str__(self):
        # return fractions.Fraction(self.a, self.b).__str__()

    def __add__ (self, f):
        if (self.b == f.b) :
            return MyFraction(self.a + f.a , f.b).simplify()
        else :
            pro = self.b * f.b
            return MyFraction(self.a * f.b + f.a * self.b , pro).simplify()

print(MyFraction(2,4))   
# 2/4
print(MyFraction(1, 2)+MyFraction(20, 30))  
# "simplify(70, 60)"=7/6
# 7/6

作为一种风格问题,您可能希望在课堂上使用“分子”代替“a”和“分母”而不是“b”。您可能希望将其命名为“MyFraction”与库“Fraction”,因此不会与其他人查看您的代码混淆。