NameError при вводе строки вместо int - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь создать простую программу, которая запускает последовательность Collatz для числа, введенного пользователем.Я также использую это для того, чтобы попытаться освоить использование операторов «try кроме» в Python, бросая оператор печати всякий раз, когда пользователь вводит строку, а не целое число.

Программа работает, как и ожидалось, при вводецелое число, например, здесь я ввожу число 12 и получаю следующий вывод:

$ python collatzSequence.py 
Enter in a number: 
12
6
3
10
5
16
8
4
2
1

Однако, когда вы вводите строку, я получаю эту ошибку:

python collatzSequence.py 
Enter in a number: 
ddd
Traceback (most recent call last):
  File "collatzSequence.py", line 34, in <module>
    main()
  File "collatzSequence.py", line 25, in main
    numb = input()
  File "<string>", line 1, in <module>
NameError: name 'ddd' is not defined

Когда что яхочу быть в состоянии поймать, когда пользователь вводит что-то, что не является целым числом, и печатать «Пожалуйста, введите целое число».

Ниже приведен мой код, который я написал, я поместил «попробовать, кроме'внутри функции collatz (), я также пытался поместить ее в функцию main (), но получил тот же результат.:

# Exploring the 'Collatz Sequence'.

# If number is even, print number // 2 and returns this value.
# If number is odd, print and return 3 * number + 1.
def collatz( number ) :
  # Error handling to make sure number entered is an int.
  try:
    number = int(number)
  except NameError :
    print( 'Please enter an integer.')
    return

  # number is even.
  if number % 2 == 0 :
    print( str(number // 2) )
    return number // 2
  # number is odd.
  else :
    print( str(3 * number + 1) )
    return 3 * number + 1

# Lets user type in an integer and keeps calling collatz() on that number until the funciton returns the value 1.
def main() :
  print( "Enter in a number: " )
  numb = input()

  numb = collatz(numb)
  while numb != 1 :
    numb = collatz(numb)



  if __name__ == "__main__":
    main()

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

1 Ответ

0 голосов
/ 05 июня 2018

Спасибо DyZ за решение этой проблемы.Проблема заключалась в том, что у меня было неправильное выражение «попробуй».Мне нужно было иметь строку 'numb = input ()' в операторе try в функции main (), поскольку это строка, которая вызывает NameError.Я также добавил оператор while, чтобы он продолжал запрашивать целое число, если пользователь продолжает вводить строку.Этот цикл прерывается при вводе int.Ниже приведен фиксированный код:

# Exploring the 'Collatz Sequence'.

# If number is even, print number // 2 and returns this value.
# If number is odd, print and return 3 * number + 1.
def collatz( number ) :
  number = int(number)

  # number is even.
  if number % 2 == 0 :
    print( str(number // 2) )
    return number // 2
  # number is odd.
  else :
    print( str(3 * number + 1) )
    return 3 * number + 1

# Lets user type in an integer and keeps calling collatz() on that number until the funciton returns the value 1.
def main() :
  print( "Enter in a number: " )

  # Error handling to make sure number entered is an int.
  while True :
    try:
      numb = input()
      break
    except NameError :
      print( 'Please enter an integer.' )

  numb = collatz(numb)
  while numb != 1 :
    numb = collatz(numb)

if __name__ == "__main__":
  main()

Предоставление результата:

$ python collatzSequence.py 
Enter in a number: 
ddd
Please enter an integer.
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Еще раз спасибо DyZ!

...