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)
我们一个一个地讲。
__init__
这个太棒了!这意味着您通过在构造函数中传递 sub_total 和百分比(与 1 的比率)来创建 Tip
对象,因此 t = Tip(15.00, 0.15)
是 15 美元的 15% 小费。万岁!
__str__
只是简单地介绍一下,除了提到它看起来更像 __repr__
而不是 __str__
,你应该使用 (
/)
而不是 [
/]
。请记住 sub_total
和 percentage
不是对象的属性——它们只是传递给其构造函数的参数。如果不将它们保存在 __init__
方法中,则无法在此处引用它们。
sub_total
首先,你不能调用它,因为它没有 self
参数。其次,即使您可以,它也无能为力。 sub_total = input()
获取用户输入,然后将其丢弃。
percentage
见上文
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
但这对于你所处的位置来说有点高级。
所以我是一个完全的编码新手,需要一些帮助。我正在尝试为小费计算器创建一个代码,但不太确定我要去哪里。我从来没有在 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)
我们一个一个地讲。
__init__
这个太棒了!这意味着您通过在构造函数中传递 sub_total 和百分比(与 1 的比率)来创建 Tip
对象,因此 t = Tip(15.00, 0.15)
是 15 美元的 15% 小费。万岁!
__str__
只是简单地介绍一下,除了提到它看起来更像 __repr__
而不是 __str__
,你应该使用 (
/)
而不是 [
/]
。请记住 sub_total
和 percentage
不是对象的属性——它们只是传递给其构造函数的参数。如果不将它们保存在 __init__
方法中,则无法在此处引用它们。
sub_total
首先,你不能调用它,因为它没有 self
参数。其次,即使您可以,它也无能为力。 sub_total = input()
获取用户输入,然后将其丢弃。
percentage
见上文
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
但这对于你所处的位置来说有点高级。