Python, unable to convert input() to int()

前端 未结 3 1970
遥遥无期
遥遥无期 2021-01-22 16:12

I am trying to convert input() data to int() with the following code:

prompt_text = \"Enter a number: \"
try:
  user_num = int(input(prompt_text))
except ValueEr         


        
相关标签:
3条回答
  • 2021-01-22 16:51

    This may not be the cleanest solution but it addresses the problem, in your code user_num is not initialized unless it is a number.

    prompt_text = "Enter a number: "
    user_num = "no Input"
    try:
      user_num = int(input(prompt_text))
    except ValueError:
      print("Error")
    
    if str(user_num).isnumeric():
      for i in range(1,10):
        print(i, " times ", user_num, " is ", i*user_num)
    
      even = ((user_num % 2) == 0)
    
      if even:
        print(user_num, " is even")
      else:
        print(user_num, " is odd")
    else:
      print("You did not enter a number")
    
    0 讨论(0)
  • 2021-01-22 16:56

    The problem isn't with the conversion to an int. user_num doesn't get a value if an exception is thrown, but it's used later.

    prompt_text = "Enter a number: "
    try:
      user_num = int(input(prompt_text)) # this fails with `asd2`
    except ValueError:
      print("Error") # Prints your error
    
    for i in range(1,10):
      print(i, " times ", user_num, " is ", i*user_num) # user_num wasn't assigned because of the error
    
    even = ((user_num % 2) == 0)
    
    if even:
      print(user_num, " is even")
    else:
      print(user_num, " is odd")
    

    You can fix this by putting the code that uses user_num in the try-block. I'll also add create a function to clean things up.

    def is_even(num):
      return num%2 == 0
    
    prompt_text = "Enter a number: "
    try:
      user_num = int(input(prompt_text))
      for i in range(1,10):
        print(i, " times ", user_num, " is ", i*user_num)
      if is_even(user_num):
        print(user_num, " is even")
      else:
        print(user_num, " is odd")
    except ValueError:
      print("Error")
    

    See the ideone here.

    0 讨论(0)
  • 2021-01-22 16:57

    The problem that you are facing is that the interpreter raises the error in the try and executes the except block. After that it will start to execute everyline. This will throw the NameError

    You can overcome that by putting the rest of the program into the else block.

    prompt_text = "Enter a number: "
    
    try:
        user_num = int(input(prompt_text))  
    
    except ValueError:
        print("Error")
    
    else:
        for i in range(1,10):
          print(i, " times ", user_num, " is ", i*user_num)
    
        even = ((user_num % 2) == 0)
    
        if even:
          print(user_num, " is even")
        else:
          print(user_num, " is odd")
    

    Quoting from the Python tutorial

    The try ... except statement has an optional else clause, which, when present, must follow all except clauses. It is useful for code that must be executed if the try clause does not raise an exception.

    Another way is to use a sentinel value

    prompt_text = "Enter a number: "
    user_num = 0 # default value
    try:
        user_num = int(input(prompt_text))
    except ValueError:
        print("Error")
    

    This will also work. However the results may not be as expected.


    Protip - Use 4 spaces to indent

    0 讨论(0)
提交回复
热议问题