我学习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
"是一个函数要实现的令人困惑的约定。你是如何使用这个函数的?有很多难看的类型检查。但是"返回一对数字,或者提出一个例外"是一个非常好的合同。你是如何使用这个函数的?用一个简单的CCD_ 12。
这就是为什么最好将异常处理放在正确的位置来处理它。如果出现错误,您希望跳过调用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
返回支付,而不是打印它,并让调用者打印它返回的值。