我大约要一周学习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)
但是为了学习,我真的很想弄清楚这个全球/本地问题。
感谢您的帮助!
答案 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
退还薪水,而不是打印出来,并使呼叫者打印它返回的值。