繁体   English   中英

分配前引用的变量

[英]Variable Referenced Before Assignment

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

这似乎是一个简单的错误,但我似乎找不到逻辑上的错误。

您可能是这个意思:

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 ,尚未声明变量。

其他答案涵盖了您遇到异常的原因,因此我将跳过该原因。 相反,我想指出一个微妙的错误,迟早会咬你,如果将税或小费输入为整数,会使代码计算错误的值。

重要提示 :这个答案对于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乘2乘以7,剩下的1。 这在许多算法中非常有用,因此一直保持下去。 如果要使用浮点除法(得到float结果),则需要确保除法中至少有一个数字是float

因此,如果您想获得0.6666...结果,则应执行2.0 / 32 / 3.0 在您的代码中,您应该执行以下任一操作:

retTax = retTax / 100
retTip = retTip / 100

否则, convertInput()您都应该将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规则)。 我现在不会详细介绍,但是现在您想了解更多有关Google的知识。

retMealretTaxretTip变量是本地convertInput和你不使用该函数的返回值,添加assignement:

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

除了别人指出的以外,我真的没有真正需要的功能

def convertInput(meal, tax, tip):

从一开始就使用浮点数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM