getHours
и getWage
предполагают, что входные данные соответственно в формате int
и float
. Таким образом, проверки для ...lower()=="done"
никогда не могут быть выполнены: если бы пользователь ввел done
в приглашении в любой из этих функций, программа умерла бы с исключением ValueError
. Но это другая ошибка.
В конце первого отрезка внешнего цикла мы знаем, что ни одна из трех строк не пуста (это гарантируют внутренние циклы). Затем эти строки не сбрасываются - поэтому они все еще не пусты - поэтому на каждом последующем участке внешнего цикла ни один из внутренних циклов никогда не будет выполнен снова. Это должно вызывать бесконечное быстрое пустое зацикливание в отличие от чистого выхода (т.е. неясно, почему симптомы очевидной ошибки, которую я только что описал, отличаются от ваших наблюдений), поэтому могут быть и другие ошибки, но когда их легко обнаружить убийственная ошибка в этом маленьком куске кода, я думаю, что разумнее перестать копать (какой смысл замечать еще нескольких? -).
Вы должны скорее реорганизовать структуру, сделав роль функций предельно ясной и точной: что именно возвращают эти функции? Если строки, каковы ограничения на эти строки? Кажется, они примерно возвращают «допустимую строку для этой записи» (за исключением возможности убить всю программу, если у пользователя есть опечатка в заработной плате или часах, чего можно избежать с помощью 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