Python-通过函数传递变量
问题描述
我使用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
返回工资,而不是打印它,并让调用者打印它返回的值。
相关文章