Python餐厅小费计算器

时间:2015-05-15 01:01:49

标签: python calculator python-2.5

所以我是编码的全新手,需要一些帮助。我正在尝试为小费计算器创建一个代码,但我不太确定我在哪里使用它。我从来没有在课堂上接受老师的教导,所以我一时兴起。有一个要求有一个班级,但我知道我会以错误的方式去做。任何帮助表示赞赏。 这就是我到目前为止所做的:

_.filter

每次我运行它都会得到这个:

import decimal

class Tip:

    def __init__(self):
        self.tip=0

    def __str__(self):
        return 'Tip['+str(self.sub_total)+' * '+str(self.percentage)+']'

    def sub_total():
        self.sub_total = input()

    def percentage():
        self.percentage = input()

    def get_tip(percentage, sub_total):
        self.percentage = decimal.Decimal(percentage)
        self.sub_total = decimal.Decimal(sub_total)
        self.tip = ((sub_total * percentage) / 100)
        self.total = (sub_total + tip)
        return self.__str__()

t = Tip()

print ("How much is the bill?")
t.sub_total()

print ("What percentage should the tip be?")
t.percentage()

print (t.get_tip())

就像我说的那样,我很乐意在我去的时候补偿,任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:2)

小男孩,有很多东西要掩盖。我会尝试全部,但将从工作代码开始。

class Bill(object):  # note: not Tip!
    def __init__(self, sub_total):
        self.sub_total = sub_total

    def calculate_tip(self, tip_pct):
        return self.sub_total * tip_pct

    def calculate_total(self, tip_pct):
        return self.sub_total * (1 + tip_pct)

这定义了一个Bill对象。如果我们想要使用它,我们可以这样做:

subtotal = float(raw_input("Bill subtotal: "))
b = Bill(subtotal)

然后获得我们可以做的提示

tip_percentage = float(raw_input("Tip Percent (15% --> 0.15): "))
tip_amt = b.calculate_tip(tip_percentage)

获得总计:

grand_total = b.calculate_total(tip_percentage)

这是你出错的地方:

您的原始课程仅供参考:

class Tip:

    def __init__(self,sub_total,percentage):
        self.tip= (sub_total * percentage)

    def __str__(self):
        return 'Tip['+str(sub_total)+' * '+str(percentage)+']'

    def sub_total():
        sub_total = input()

    def percentage():
        percentage = input()

    def get_tip(percentage, sub_total):
        percentage = decimal.Decimal(percentage)
        sub_total = decimal.Decimal(sub_total)
        tip = ((sub_total * percentage) / 100)
        total = (sub_total + tip)
        return Tip(total)

我们将按方法讨论它。

  1. __init__
  2. 这个很棒!这意味着您通过在构造函数中传递sub_total和百分比(作为比率为1)来创建Tip对象,因此t = Tip(15.00, 0.15)是15美元的15%小费。万岁!

    1. __str__
    2. 除了提及这看起来更像是__repr__而不是__str__之外,我只能简单地介绍一下这个问题,而应该使用( / )代替[ / ]。请记住,sub_totalpercentage不是对象的属性 - 它们只是传递给构造函数的参数。如果您不将它们保存在__init__方法中,则无法在此处引用它们。

      1. sub_total
      2. 首先,你不能调用它,因为它没有self参数。其次,即使你可以做也没有做任何事情。 sub_total = input()获取用户输入,然后将其抛弃。

        1. percentage
        2. 见上文

          1. get_tip
          2. 你又错过了一个self论点,但我会像get_tip(self, percentage, sub_total)那样谈论它。你可以使用你已经创建的Tip对象来调用它(当我们做t = Tip(15, 0.15)时,请记住上面的内容?)并使用你可能传递给构造函数的参数调用它。换句话说:

            t = Tip(15, 0.15)  # 15% tip on $15
            t.get_tip(0.15, 15)  # ...15% tip on $15, but the grand total...
            

            它作为一种功能并没有很多意义。特别是因为已经完成了一半的工作并保存在self.tip中。如果这是您想要用于对象的模式,则可以执行以下操作:

            class Tip(object):
                def __init__(self, sub_total, tip_pct):
                    self.sub_total = sub_total
                    self.tip_pct = tip_pct
                    # saving these as attributes so we can use them later
                    self.grand_total = self.sub_total * (1 + self.tip_pct)
                    self.tip_amt = self.sub_total * self.tip_pct
            

            但对于我来说,这看起来更像是一系列功能,而不是需要保存为对象的东西!

            Nota Bene

            请记住,类可以为您的代码提供运行状态。在这种情况下,您可以真正应用的唯一状态是“提示多少”,所以我想您可以执行相反的操作并执行此操作类似的东西:

            t = Tip(0.15)
            t.calculate_total(amt_of_bill)
            

            但这对我来说似乎很愚蠢。你可以创建一个类似于:

            的工厂函数
            def tip(tip_pct):
                def wrapped(bill_amt):
                    return bill_amt * (1 + tip_pct)
                return wrapped
            

            但对于你所处的位置来说,这有点先进。

答案 1 :(得分:0)

您需要先创建一个小费计算器对象。然后,我看到对象可以自己接受输入。我认为以下代码将解决您的问题(或者至少让您更接近正确答案)。

所以试试这个:

class Tip:

    def __init__(self):
        self.tip=0

    def __str__(self):
        return 'Tip['+str(self.sub_total)+' * '+str(self.percentage)+']'

    def sub_total():
        self.sub_total = input()

    def percentage():
        self.percentage = input()

    def get_tip(percentage, sub_total):
        self.percentage = decimal.Decimal(percentage)
        self.sub_total = decimal.Decimal(sub_total)
        self.tip = ((sub_total * percentage) / 100)
        self.total = (sub_total + tip)
        return self.__str__()

t = Tip()

print ("How much is the bill?")
t.sub_total()

print ("What percentage should the tip be?")
t.percentage()

print (t.get_tip())

答案 2 :(得分:0)

您的计划中有一些错误。最活跃的,即创建文本的那个,是get_tip调用的缺失括号。你实际上是打印函数,而不是结果。

然而,这本身并不足够。还有更多,这里有一个列表:

  • 您似乎没有OOP句柄,并且这个作业并不是必需的。你可以把这些功能带出课堂。
  • get_tip
  • 外,所有功能都是不必要的
  • print语句可以像input("foo: ")
  • 一样进入输入内部
  • 您需要将每个答案保存到其他变量。
  • 在python2中打印时不需要parens

以下是我对这个问题的看法:

def get_tip(percentage, sub_total):
    tip = ((sub_total * percentage) / 100)
    total = (sub_total + tip)
    return total

sub_total = input("How much is the bill?")

percentage = input("What percentage should the tip be?")

print get_tip(percentage, sub_total)

有。 Mcuh更简单。

答案 3 :(得分:-1)

自从我实际使用过Python以来,它已经有点了,但从我可以看到你想要实际调用类Tip的实例。因此,您只需提及x=Tip()而不是仅提及提示。

输入的使用也有点不对。你打电话给answer两次,所以那里什么也没发生。您已经有两种方法可以读取输入,因此您可以使用这些方法来获取子总数和百分比。

这应该更好:

import decimal

class Tip:

    def __init__(self,sub_total,percentage):
        self.tip= (sub_total * percentage)

    def __str__(self):
        return 'Tip['+str(sub_total)+' * '+str(percentage)+']'

    def sub_total():
        sub_total = input()

    def percentage():
        percentage = input()

    def get_tip(percentage, sub_total):
        percentage = decimal.Decimal(percentage)
        sub_total = decimal.Decimal(sub_total)
        tip = ((sub_total * percentage) / 100)
        total = (sub_total + tip)
        return Tip(total)

    t = Tip()

    print ("How much is the bill?")
    t.sub_total()

    print ("What percentage should the tip be?")
    t.percentage()

    print (t.get_tip)