最近,我在自学时遇到了一个初学者的问题,要求我编写一个程序来计算给定输入的工时和小时工资。超过40小时的任何时间,都应支付半小时工资。我成功地做到了这一点,但出于某种原因,我觉得这很奇怪。以下代码非常有效,我在作业中获得了100%的分数:
def computepay(h,r):
try:
hrsfloat = float(h)
except:
print("Error: 'Hours' must be a number")
quit()
try:
ratefloat = float(r)
except:
print("Error: 'hourly rate in dollars' must be a number")
quit()
if hrsfloat <= 40:
return(hrsfloat*ratefloat)
else:
x=hrsfloat-40
return((1.5 * x + 40) * ratefloat)
h = input("Enter Hours:")
r = input("Enter hourly rate in dollars:")
p = computepay(h,r)
print('Pay', p)
但出于某种原因,我宁愿把
h = input("Enter Hours:")
r = input("Enter hourly rate in dollars:")
在computepay
的定义中,以以下方式:
def computepay(h,r):
h = input("Enter Hours:")
r = input("Enter hourly rate in dollars:")
try:
hrsfloat = float(h)
except:
print("Error: 'Hours' must be a number")
quit()
try:
ratefloat = float(r)
except:
print("Error: 'hourly rate in dollars' must be a number")
quit()
if hrsfloat <= 40:
return(hrsfloat*ratefloat)
else:
x=hrsfloat-40
return((1.5 * x + 40) * ratefloat)
p = computepay(h,r)
print('Pay', p)
但这会返回一个错误:
Traceback (most recent call last): File "C:[redacted]", line 20, in p = computepay(h,r) NameError: name 'h' is not defined
那么,有没有一种方法可以写入computepay
,从而使它以这种方式自包含?我不知道为什么我觉得必须这么做,但我真的这么做了
您可以指定默认值
None
,以确定是否需要用户输入:然后您可以用几种不同的方式调用
computepay
,包括我认为保持
computepay
函数的原样是最有意义的:获取一些参数,从这些参数中计算一些东西,然后返回结果。然后,您可以将所有代码放入一个函数中,我在这里按约定调用了main
,稍后将调用该函数:是的,你可以。如错误消息所示,问题在于
h
和r
在调用函数的位置不存在:请注意,这些函数与函数中定义的函数不同!如果你感到困惑,请仔细阅读scopes
解决方案是省略函数定义和调用站点中的参数:
然而,有理由将这些变量作为参数传递。如果它只做一件事(计算工资),而不是做两件正交的事(请求输入,然后计算工资),那么它会使您的函数更加通用。如果您将这些值作为参数传递,则函数不关心它们来自何处,因此调用代码可以从文件或GUI中读取它们,而无需修改函数本身
这种多功能性还使函数更易于进行单元测试,Python以doctests的形式特别支持单元测试
如果你还在掌握语言的基本知识,你就不必担心这一点。我只是想提一下
相关问题 更多 >
编程相关推荐