尝试使用布尔开关设置嵌套while循环

2024-09-30 12:18:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图设置一个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

Tags: orthenameforifisemployeeprint
2条回答

getHours和{}假设输入分别为int和{}格式。因此,...lower()=="done"的检查永远不可能得到满足:如果用户在这两个函数中的任何一个的提示下输入了done,那么程序就会因ValueError异常而死亡。但那是另一个错误。在

在外循环的第一段末尾,我们知道这三个字符串都不是空的(内部循环保证这一点)。然后,这些字符串不会被重置,所以它们仍然不是空的,所以在外循环的每个分支上,没有一个内部循环会再次执行。这将导致无限快的空循环,而不是一个干净的出口(即,不清楚为什么我刚才描述的明显缺陷的症状与您的观察结果不同),因此,可能还会有更多的bug,但是当这一小段代码中有两个很容易被发现的致命bug时,我认为停止挖掘是明智的(再找出另外几个有什么用?-). 在

您应该重构结构,使函数的作用非常明确和精确:这些函数究竟返回什么?如果是字符串,对这些字符串的约束是什么?似乎他们大致返回了“一个有效的输入字符串”(除了如果用户在工资或工作时间中有错误,可能会杀死所有程序,你可以用一个try/except)第一个,而且只有一个可以返回done(但是它应该在它的提示中说明这一点,并避免第二个如果用户对第一个提示说done,则提示无效)。一旦将它们记录为这样,就可以清楚地看到内部while循环是不必要的;外部循环可能只是

while True:
    employeeName=getName() 
    if employeeName.lower()=="done":
        break
    print "The employee's name is", employeeName

    employeeHours=getHours() 
    print employeeName, "worked", employeeHours, "this week."

    employeeWage=getWage() 
    print employeeName + "'s hourly wage is $" + employeeWage

问题是在第一个循环之后,employeeName和其他变量已经有了值,所以内部while循环将被跳过。这会导致外循环无限重复而不做任何事情。在

我将只删除内部while循环:实际上并不需要它们,因为您已经在getHours和其他函数中进行了验证。另一个选项是在外部while循环开始时重置变量值。在

还有一些需要改进的地方(与此错误无关):

  • getHoursgetWage中,您只需使用while True而不是现在的条件。如果条件为false,那么您已经从函数返回了。

  • 您需要在getHoursgetWage中捕获{},以防输入非数字数据。

  • 使用booleanDone==False,而不是booleanDone==False,而是使用not booleanDone。不过,如果像我建议的那样移除内部循环,那么您甚至不需要这个布尔值:只需在需要时脱离循环。

相关问题 更多 >

    热门问题