Python-通过函数传递变量

2022-02-26 00:00:00 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)

但是为了学习,我真的很想把这个全局/局部的事情弄清楚。

谢谢您的帮助!

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返回工资,而不是打印它,并让调用者打印它返回的值。

相关文章