Python 餐厅小费计算器

Python Restaurant Tip Calculator

所以我是一个完全的编码新手,需要一些帮助。我正在尝试为小费计算器创建一个代码,但不太确定我要去哪里。我从来没有在 class 被我的老师教过,所以我一时兴起。有一个 class 的要求,但 我知道 我正在以错误的方式去做。任何帮助表示赞赏。 这是我目前所拥有的:

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())

每次我 运行 我得到这个:

get_tip() takes exactly 2 arguments (1 given)

就像我说的那样,我有点想边做边做,我们将不胜感激任何帮助。

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

所以试试这个:

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())

您的程序中有一些错误。最明显的是创建您看到的文本的是 get_tip 调用中缺少的括号。您实际上是在打印 函数,而不是结果。

但是,这本身是不够的。还有很多,这里是它们的列表:

  • 您似乎没有 OOP 的句柄,对于这个作业来说也不是必需的。您可以从 class.
  • 中取出函数
  • 除了get_tip.
  • ,所有的功能都是不必要的
  • 打印语句可以进入输入内部,如 input("foo: ")
  • 您需要将每个答案保存到不同的变量。
  • python2
  • 中的打印不需要括号

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

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更简单。

自从我实际使用 Python 以来已经有一段时间了,但据我所知,您实际上想要调用 class 提示的实例。因此,您不只是指 Tip,而是说 x=Tip()

input的使用也有点不对。您正在调用 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)

天哪,有很多事情要讲。我会尝试全部掌握,但将从工作代码开始。

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,供参考,如下所示:

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__

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

  1. __str__

只是简单地介绍一下,除了提到它看起来更像 __repr__ 而不是 __str__,你应该使用 (/) 而不是 [/]。请记住 sub_totalpercentage 不是对象的属性——它们只是传递给其构造函数的参数。如果不将它们保存在 __init__ 方法中,则无法在此处引用它们。

  1. sub_total

首先,你不能调用它,因为它没有 self 参数。其次,即使您可以,它也无能为力。 sub_total = input() 获取用户输入,然后将其丢弃。

  1. percentage

见上文

  1. get_tip

你又漏掉了一个 self 论点,但我会把它当作 get_tip(self, percentage, sub_total) 来讨论。您可以通过使用已经创建的 Tip 对象来调用它(还记得上面我们做的 t = Tip(15, 0.15) 吗?)并使用您可能传递给构造函数的参数来调用它。也就是说:

t = Tip(15, 0.15)  # 15% tip on 
t.get_tip(0.15, 15)  # ...15% tip on , 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

但这对我来说真的更像是一系列函数,而不是需要保存为对象的东西!

诺塔贝内

请记住,classes 在这里为您的代码提供一个状态 运行。在这种情况下,您真正​​可以应用的唯一状态是 "How much to tip," 所以我想你可以做相反的事情,做类似的事情:

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

但这对于你所处的位置来说有点高级。