我试图设置一个while
循环,它将询问用户员工姓名、工作时间和小时工资,直到用户输入“DONE”。最后,我将修改代码以计算周工资并将其写入一个列表,但一次只能做一件事。问题是一旦主while
循环执行一次,它就会停止。不会出错,只是停下来。我必须终止程序才能让它停止。我想让它一遍又一遍地问这三个问题,直到用户完成。思想?在
请注意,这只是一个练习,不适用于任何实际应用。在
def getName():
"""Asks for the employee's full name"""
firstName=raw_input("\nWhat is your first name? ")
lastName=raw_input("\nWhat is your last name? ")
fullName=firstName.title() + " " + lastName.title()
return fullName
def getHours():
"""Asks for the number of hours the employee worked"""
hoursWorked=0
while int(hoursWorked)<1 or int(hoursWorked) > 60:
hoursWorked=raw_input("\nHow many hours did the employee work: ")
if int(hoursWorked)<1 or int(hoursWorked) > 60:
print "Please enter an integer between 1 and 60."
else:
return hoursWorked
def getWage():
"""Asks for the employee's hourly wage"""
wage=0
while float(wage)<6.00 or float(wage)>20.00:
wage=raw_input("\nWhat is the employee's hourly wage: ")
if float(wage)<6.00 or float(wage)>20.00:
print ("Please enter an hourly wage between $6.00 and $20.00")
else:
return wage
##sentry variables
employeeName=""
employeeHours=0
employeeWage=0
booleanDone=False
#Enter employee info
print "Please enter payroll information for an employee or enter 'DONE' to quit."
while booleanDone==False:
while employeeName=="":
employeeName=getName()
if employeeName.lower()=="done":
booleanDone=True
break
print "The employee's name is", employeeName
while employeeHours==0:
employeeHours=getHours()
if employeeHours.lower()=="done":
booleanDone=True
break
print employeeName, "worked", employeeHours, "this week."
while employeeWage==0:
employeeWage=getWage()
if employeeWage.lower()=="done":
booleanDone=True
break
print employeeName + "'s hourly wage is $" + employeeWage
getHours
和{int
和{...lower()=="done"
的检查永远不可能得到满足:如果用户在这两个函数中的任何一个的提示下输入了done
,那么程序就会因ValueError
异常而死亡。但那是另一个错误。在在外循环的第一段末尾,我们知道这三个字符串都不是空的(内部循环保证这一点)。然后,这些字符串不会被重置,所以它们仍然不是空的,所以在外循环的每个分支上,没有一个内部循环会再次执行。这将导致无限快的空循环,而不是一个干净的出口(即,不清楚为什么我刚才描述的明显缺陷的症状与您的观察结果不同),因此,可能还会有更多的bug,但是当这一小段代码中有两个很容易被发现的致命bug时,我认为停止挖掘是明智的(再找出另外几个有什么用?-). 在
您应该重构结构,使函数的作用非常明确和精确:这些函数究竟返回什么?如果是字符串,对这些字符串的约束是什么?似乎他们大致返回了“一个有效的输入字符串”(除了如果用户在工资或工作时间中有错误,可能会杀死所有程序,你可以用一个
try
/except
)第一个,而且只有一个可以返回done
(但是它应该在它的提示中说明这一点,并避免第二个如果用户对第一个提示说done
,则提示无效)。一旦将它们记录为这样,就可以清楚地看到内部while循环是不必要的;外部循环可能只是问题是在第一个循环之后,
employeeName
和其他变量已经有了值,所以内部while循环将被跳过。这会导致外循环无限重复而不做任何事情。在我将只删除内部while循环:实际上并不需要它们,因为您已经在
getHours
和其他函数中进行了验证。另一个选项是在外部while循环开始时重置变量值。在还有一些需要改进的地方(与此错误无关):
在
getHours
和getWage
中,您只需使用while True
而不是现在的条件。如果条件为false,那么您已经从函数返回了。您需要在},以防输入非数字数据。
getHours
和getWage
中捕获{使用
booleanDone==False
,而不是booleanDone==False
,而是使用not booleanDone
。不过,如果像我建议的那样移除内部循环,那么您甚至不需要这个布尔值:只需在需要时脱离循环。相关问题 更多 >
编程相关推荐