2015-05-14 2 views
0

Я пытаюсь настроить приведенный ниже код, чтобы попросить пользователя ввести два целых числа (num_sides & num_rolls). Если пользователь не вводит целое число для ввода, тогда код должен распечатать инструкцию «Введите целое число».Python: If ... и ... не работает как ожидалось

Я нахожу, что этот код проверяет только num_sides, но не проверяет, является ли num_rolls целое число. Что тут происходит?

Заранее благодарим за вашу помощь!

def rolldice(): 
    while True: 
     while True: 
      num_sides = input("Enter number of sides for die: ") 
      num_rolls = input("Enter number of rolls for die: ") 
      try: 
       if int(num_sides) != num_sides or int(num_rolls) != num_rolls: 
        break 
       break 
      except(ValueError): 
       print("Enter an integer") 
       True 
+4

Какая странная петля. Во-первых, 'num_sides' переводится в' int' и сравнивается с его оригинальной формой (строкой), которая никогда не будет 'True'. – Makoto

+0

Почему у вас есть 'break' как внутри, так и снаружи вашего 'if'? И что вы ожидали от «Истины» на одной линии, чтобы сделать для вас? – user2357112

+0

Некоторые ответы просто проверяют, могут ли они * быть добавлены * в 'int'. Вы также пытаетесь проверить, являются ли числа целыми числами, или это не важно? Я имею в виду, если кто-то помещает в 3.3, вы хотите, чтобы он выдавал исключение (проверяли, является ли число целым числом *) или просто переданы в 3 (как это делают текущие ответы)? – leekaiinthesky

ответ

2

Почему у вас есть вложенная петля? (Два while True один внутри другого)

Следующий код является более простым и должно работать:

def rolldice(): 
    while True: 
     num_sides = input("Enter number of sides for die: ") 
     num_rolls = input("Enter number of rolls for die: ") 
     try: 
      int(num_sides) 
      int(num_rolls) 
      break 
     except ValueError: 
      print("Enter an integer") 

Если оба int оценить и не врезаться то break выполняется, и вы можете оставить петлю.

Как функция, вы можете вернуть (num_sides, num_rolls) в конце функции, чтобы они не были потеряны. (Вы также можете заменить break на return, что также эффективно остановит функцию одновременно)

Если это только начало вашего кода, то неважно, что я только что сказал. :)

+0

Правильно, есть еще код ... но это не имело никакого отношения к моему вопросу. Спасибо за помощь. – MK2009

0

Вы можете просто бросить int и проверить на ValueError:

def rolldice(): 
    while True: 
     try: 
      num_sides = int(input("Enter number of sides for die: ")) 
      num_rolls = int(input("Enter number of rolls for die: ")) 
      break 
     except ValueError: 
      print("Enter an integer") 

>>> rolldice() 
Enter number of sides for die: 5 
Enter number of rolls for die: foo 
Enter an integer 
Enter number of sides for die: foo 
Enter an integer 
Enter number of sides for die: bar 
Enter an integer 
Enter number of sides for die: 1 
Enter number of rolls for die: 2 
>>> 
+0

Используйте ['' 'isinstance()' ''] (https://docs.python.org/3/library/functions.html#isinstance), чтобы проверить/подтвердить тип объекта. – wwii

+0

Короче, чем моя версия. Поведение немного отличается от моей версии, я придерживался формата OP, но это тоже хорошо! – JeromeJ

+0

@wwii Не очень Pythonic Я бы сказал ('is_instance' вообще, в основном из-за« утиной печати »). – JeromeJ

Смежные вопросы