分配前引用的变量

时间:2013-06-30 22:55:51

标签: python

我正在学习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 个答案:

答案 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.00.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)

retMealretTaxretTip变量是convertInput的本地变量,并且您没有使用该函数返回的值,添加一个分配:

retMeal, retTax, retTip = convertInput(meal, tax, tip)

答案 3 :(得分:0)

除了其他人指出的内容外,我真的认为没有真正需要这个功能

def convertInput(meal, tax, tip):

从头开始使用花车