2013-09-10 4 views
-1

Так что я делаю калькулятор чаевых на данный момент. То, что я застрял, - это то, где они могут ввести общую сумму стоимости. Если они вводят целое число, я хочу, чтобы оно вырвалось из цикла, но если они вводят что-то еще, чем целое число, я хочу, чтобы он оставался в цикле и сказал им ввести целое число. Вот код, который я сделал для этой части. (Не весь код)Loop in Tip Calculator (Python)

Integer = range(1,10000) 




while True: 
    while True: 
     Cost = raw_input("What was the cost? ") 
     Cost = int(Cost) 
     if Cost in Integer: 
      break 
     else: 
      pass 

Интервал может выглядеть неправильно, но он находится в подлинном сценарии. Я до сих пор не знаю, как вставить код здесь, не добавляя 4 пробела в каждую строку. В любом случае, пожалуйста, дайте мне знать, что вы сделаете, чтобы выполнить нужную мне задачу.

ответ

1

Cost = int(Cost) поднимет ValueError, если Cost не является строкой для целого.

как таковой,

while True: 
     Cost = raw_input("What was the cost? ") 
     try: 
      Cost = int(Cost) 
      break 
     except ValueError: 
      print("Please enter an Integer for the cost") 

, как вы можете видеть, перерыв будет выполняться только тогда, когда ValueError не поднимается.

Вы не должны этого делать. То, что вы должны сделать, это испытание для isdigit перед заливкой:

while True: 
     Cost = raw_input("What was the cost? ") 
     if Cost.isdigit(): 
      Cost = int(Cost) 
      break 
     else: 
      print("Please enter an Integer for the cost") 

исключения составляют управление потоком быть неочевидным и его следует избегать, если это возможно.

+0

Внешний контур для остальной части кода. Я не поместил весь код в пример, просто цикл, с которым у меня были проблемы. Спасибо за ваш ответ, я ценю это. – TheSuds13

+1

«Вы не должны этого делать». Почему нет? Это совершенно правильный код Python. В отличие от другого, он использует [EAFP вместо LBYL] (http://docs.python.org/2/glossary.html), что является предпочтительным способом делать вещи на Python. – glglgl

2

Кастинг объект String, к междунар может вызвать исключение ValueError, однако поскольку raw_input() возвращает str объект, который вы можете легко проверить, если это все цифры с isdigit(). Полная документация isdigit() является found here

if cost.isdigit(): 
    cost = int(cost) 
    break 
else: 
    cost = raw_input("What is the cost? ") 

Это был номер проблемы 1. Проблема № 2 вы облицовкой if Cost in Integer.

Это не то, как это работает, вы, вероятно, после того, как if isinstance(cost, int):, потому что вы хотите проверить, если это целое число, после того, как все (так как вы преобразовав его)

и, наконец:

Вы не должны используйте while True, в то время как это работает для вас, вы не сможете сломать его, так как вы не присвоили переменной True.

outer = True 
inner = True 

while outer: 
    while inner: 
    #your code here 
    inner = False #now it will break automatically from the inner loop. 
+0

тестирование isdigit намного красивее моего решения. не знал об этом. реквизит для вас. – Julius

+1

Если сумма равна долларам и центам, 'isdigit()' будет 'False':' '123.45'.disit() == False' –

+0

@BurhanKhalid Да, это правда, но я оставил это для OP как упражнение. Покрытие всех угловых дел - это боль. –