我正在学习Python,并试图将小费计算器作为第一个小项目。
我想出了以下代码:
meal = raw_input("Cost of meal: ")
tax = raw_input("Tax: ")
tip = raw_input("Tip: ")
def tipCalc(meal, tax, tip):
def convertInput(meal, tax, tip):
try:
retMeal = int(meal)
retTax = int(tax)
retTip = int(tip)
except ValueError:
retMeal = float(meal)
retTax = float(tax)
retTip = float(tip)
return retMeal
return retTax
return retTip
convertInput(meal, tax, tip)
retTax = retTax / 100
retTip = retTip / 100
total = retMeal + retTax + retTip
print total
tipCalc(meal, tax, tip)
但是,我收到以下错误:
Traceback (most recent call last):
File "/Users/dustin/Desktop/tipcalc.py", line 27, in <module>
tipCalc(meal, tax, tip)
File "/Users/dustin/Desktop/tipcalc.py", line 22, in tipCalc
retTax = retTax / 100
UnboundLocalError: local variable 'retTax' referenced before assignment
这似乎是一个简单的错误修复,但我似乎无法在我的逻辑中找到错误。
答案 0 :(得分:4)
你可能是这个意思:
def tipCalc(meal, tax, tip):
def convertInput(meal, tax, tip):
try:
retMeal = int(meal)
retTax = int(tax)
retTip = int(tip)
except ValueError:
retMeal = float(meal)
retTax = float(tax)
retTip = float(tip)
return retMeal, retTax, retTip
retMeal, retTax, retTip = convertInput(meal, tax, tip)
retTax = retTax / 100
retTip = retTip / 100
total = retMeal + retTax + retTip
print total
tipCalc(meal, tax, tip)
如果希望从类方法返回多个值,则多个return语句不起作用。您需要有1个return语句,并根据需要发回尽可能多的值。
此外,错误是在计算retTax = retTax / 100
时,该变量尚未声明。
答案 1 :(得分:3)
其他答案已经涵盖了你获得例外的原因,所以我将跳过这个。相反,我想指出一个微不足道的错误,迟早会咬你,如果税或小费输入为整数,你的代码会计算错误的值。
重要:对于Python 2.x(我看到你正在使用),这个答案是正确的。在Python 3.x中,除法的默认行为发生了变化,这个答案将不再成立(并且您的代码可以正常工作)。
考虑到这一点,让我们看一下Python解释器中的内容一分钟。
Python 2.7.4 (default, Apr 19 2013, 18:28:01)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 2.0 / 3.0
0.6666666666666666
>>> 2 / 3
0
在第一个例子中,我们看到当我们将两个浮点数分开时会发生什么:我们得到一个浮点数,我们可以得到最接近的结果。 (2/3永远不会被浮点数完全表示,但几乎所有目的都足够接近)。但是看第二个例子?而不是0.666 ...,它返回0.为什么?
那是因为在Python 2.x中,将两个int
分开在一起可以保证始终返回int
,因此它向下舍入(总是向下)到int。结合%
运算符(返回余数),这可以让你进行“小学”分区,其中3分为7分,只有2分,剩下1分。这在许多算法中非常有用,因此它保持不变。如果您想使用浮点除法(得到float
结果),您需要确保该除法中至少有一个数字是float
。
因此,如果您希望我们的示例中包含2.0 / 3
结果,您应该2 / 3.0
或0.6666...
。在你的代码中,你应该这样做:
retTax = retTax / 100
retTip = retTip / 100
或者您应该将convertInput()
函数更改为始终返回浮点数,无论如何。我建议后者:
def convertInput(meal, tax, tip):
retMeal = float(meal)
retTax = float(tax)
retTip = float(tip)
return retMeal, retTax, retTip
这样,当你将它们除以100之后,你会得到一小部分。否则,您最终可能会在税收或提示中获得int
结果,并在计算中得到一个四舍五入的值。
还有另一种方法可以改变Python关于除法的行为,使用Python 2.x中的from __future__ import division
语句(它应用了一些Python 3.x规则)。我现在不会详细介绍它,但是如果你想了解更多信息,现在你知道谷歌会怎么做。
答案 2 :(得分:2)
retMeal
,retTax
和retTip
变量是convertInput
的本地变量,并且您没有使用该函数返回的值,添加一个分配:
retMeal, retTax, retTip = convertInput(meal, tax, tip)
答案 3 :(得分:0)
除了其他人指出的内容外,我真的认为没有真正需要这个功能
def convertInput(meal, tax, tip):
从头开始使用花车