1

我正在学习 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

这似乎是一个要修复的简单错误,但我似乎无法在我的逻辑中找到错误。

4

4 回答 4

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 个返回语句,并发送回任意数量的值。

此外,错误是,在计算时retTax = retTax / 100,该变量尚未声明。

于 2013-06-30T22:58:55.263 回答
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保证将两个 s 相除总是返回 an 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 关于除法的行为,使用from __future__ import divisionPython 2.x 中的语句(它应用了一些 Python 3.x 规则)。我现在不会详细介绍它,但是现在您知道如果您想了解更多有关它的信息,可以使用 Google 搜索什么。

于 2013-06-30T23:22:25.010 回答
2

,和变量是本地的,retMeal并且您没有使用函数返回的值,请添加一个赋值:retTaxretTipconvertInput

retMeal, retTax, retTip = convertInput(meal, tax, tip)
于 2013-06-30T22:59:16.917 回答
0

除了其他人指出的以外,我真的认为没有真正需要该功能

def convertInput(meal, tax, tip):

从一开始就使用浮点数

于 2013-06-30T23:13:33.503 回答