Python-通过函数传递变量

时间:2018-07-28 05:01:51

标签: python global-variables

我大约要一周学习Python。我已经查看了与此有关的其他各种问题,并且对我实施这些建议的尝试感到沮丧。

根据我已阅读的内容,我尝试了几种传递变量的方法。例如(这不一定代表一个连贯的尝试。我尝试了许多变体,不得不回过头来获得值得发布的代码):

def verify_nums():
    globhours = hours
    globrate = rate
    try:
        globhours = float(globhours)
        globrate = float(globrate)
        return globhours,globrate
    except:
        print("You must provide numbers")

def calc():
    globhours = globhours
    globrate = globrate
    if globhours > 40:
        base = 40 * globrate
        ot = (globhours - 40) * (globrate * 1.5)
        pay = base + ot
        print(pay)
    else:
        pay = globrate * globhours
        print(pay)


hours = input("Enter hours worked: ")
rate = input("Enter hourly rate: ")
verify_nums()
calc()

我对如何将小时数和费率变量转移到calc()函数感到非常困惑。

我最终发现我可以将它们合并为一个函数...

def paycalc(hours,rate):
    etc.
    etc.

hours = input("Enter hours: ")
hours = input("Enter hours: ")
paycalc(hours,rate)

但是为了学习,我真的很想弄清楚这个全球/本地问题。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试让Python根据名称来猜测哪些函数应该是全局函数,哪些应该是局部函数。 Python不会那样做。如果您为函数中的变量赋值,并且希望该赋值是全局赋值,则在函数顶部需要一个global语句:

def verify_nums():
    global globhours
    global blograte
    globhours = hours
    globrate = rate
    # ...

此外,globhours = globhours并没有做任何有用的事情-实际上,这会引起问题。如果您也global globhours使用该函数,则该语句是没有意义的。否则,您将创建一个局部变量,并为其分配…那个尚不存在的局部变量的值。

无论如何,如果将正确的global声明添加到所有函数中,它们将起作用,但它并不是一个很好的设计。


您这里确实不需要任何全局变量。如果您考虑的是而不是变量,那么一切都会变得容易得多。

您的verify_nums函数需要处理两个值。因此,只需将这些值作为参数传递即可。它需要返回两个值-很简单,您已经完成了那一部分。

现在,调用者必须存储它返回的那两个值,因此可以将它们传递给calc函数。也可以将两个值作为参数。

将它们放在一起:

def verify_nums(hours, rate):    
    try:
        numhours = float(hours)
        numrate = float(rate)
        return numhours, numrate
    except:
        print("You must provide numbers")

def calc(hours, rate):
    if hours > 40:
        base = 40 * rate
        ot = (hours - 40) * (rate * 1.5)
        pay = base + ot
        print(pay)
    else:
        pay = rate * hours
        print(pay)

globhours = input("Enter hours worked: ")
globrate = input("Enter hourly rate: ")
hours, rate = verify_nums(globhours, globrate)
calc(hours, rate)

还剩下一个问题:如果用户输入有错误怎么办?在verify_nums内部,您用except:处理错误,然后打印一条消息,但不执行任何操作。这意味着您返回None。因此,当调用者尝试执行hours, rate = None时,将会得到一个错误,您将无法处理。而且,您不能仅仅没有价值就继续前进。你能做什么?

更一般地说,“返回一对数字或返回None”是使函数实现的令人困惑的契约。您如何使用该功能?具有大量难看的类型检查。但是“返回一个数字,或引发一个例外”是一个非常好的合同。您如何使用该功能?简单的try

这就是为什么最好将异常处理放在正确的位置进行处理。如果发生错误,您想跳过呼叫calc,因此except必须位于您呼叫calc的地方。

def verify_nums(hours, rate):    
    numhours = float(hours)
    numrate = float(rate)
    return numhours, numrate

def calc(hours, rate):
    if hours > 40:
        base = 40 * rate
        ot = (hours - 40) * (rate * 1.5)
        pay = base + ot
        print(pay)
    else:
        pay = rate * hours
        print(pay)
try:
    globhours = input("Enter hours worked: ")
    globrate = input("Enter hourly rate: ")
    hours, rate = verify_nums(globhours, globrate)
except ValueError:
    print("You must provide numbers")
else:
    calc(hours, rate)

您可能需要考虑的另一项改进:让calc退还薪水,而不是打印出来,并使呼叫者打印它返回的值。