Of course! The term "input check" in Python refers to the process of validating and cleaning data that a user provides via the input() function. Since input() always returns a string, you almost always need to check and convert it to the desired data type (like an integer, float, or a specific string format).
Here’s a comprehensive guide covering different levels of input checking, from simple to robust.
The Basic Problem: input() is Always a String
Let's start with a simple program that asks for a number.
# A naive attempt
age = input("How old are you? ")
print(f"In 10 years, you will be {age + 10} years old.")
This will crash with a TypeError, because you can't add a string ("25") and an integer (10).
TypeError: can only concatenate str (not "int") to str
We must first convert the string to a number.
Level 1: Basic Type Conversion (Simple but Flawed)
This is the most straightforward approach. We try to convert the input and catch errors.
while True:
try:
# Try to convert the input to an integer
age = int(input("How old are you? "))
break # If successful, exit the loop
except ValueError:
# If the user enters text that isn't a number, this block runs
print("Invalid input. Please enter a whole number.")
print(f"In 10 years, you will be {age + 10} years old.")
How it works:
- The
while Trueloop keeps asking for input until a valid one is given. int(input(...))attempts to convert the user's string to an integer.- If the user enters
"25", it works, andbreakexits the loop. - If the user enters
"twenty"or"12.5",int()cannot convert it and raises aValueError. - The
except ValueError:block "catches" this error, prints a friendly message, and the loop repeats.
Limitation: This doesn't check if the number makes sense (e.g., age can't be 200).
Level 2: Checking Value Range (More Robust)
Now, let's add a check to ensure the number is within a reasonable range.
while True:
try:
age = int(input("How old are you? "))
if age < 0:
print("Age cannot be negative.")
elif age > 120:
print("Are you sure you're over 120? Please enter a valid age.")
else:
# If the number is valid, break the loop
break
except ValueError:
print("Invalid input. Please enter a whole number.")
print(f"In 10 years, you will be {age + 10} years old.")
How it works:
- It still has the
try-exceptblock for type conversion. - The
if/elif/elsestatements check if the converted integeragefalls within a logical range. - The loop only breaks (
break) if the input passes both the type check (int) and the value range check.
Level 3: Creating a Reusable Input Function (Best Practice)
For cleaner and more reusable code, it's best to wrap your input-checking logic in a function. This function can be customized for different needs.
Here is a highly versatile function for getting an integer input.
def get_integer_input(prompt, min_value=None, max_value=None):
"""
Prompts the user for an integer and validates it.
Args:
prompt (str): The message to display to the user.
min_value (int, optional): The minimum allowed value.
max_value (int, optional): The maximum allowed value.
Returns:
int: The validated integer entered by the user.
"""
while True:
try:
# Get input and try to convert
value = int(input(prompt))
# Check for minimum value
if min_value is not None and value < min_value:
print(f"Error: Value must be at least {min_value}.")
continue # Skip the rest of the loop and ask again
# Check for maximum value
if max_value is not None and value > max_value:
print(f"Error: Value must be at most {max_value}.")
continue # Skip the rest of the loop and ask again
# If all checks pass, return the value
return value
except ValueError:
# Handle non-integer input
print("Invalid input. Please enter a whole number.")
# --- Example Usage ---
user_age = get_integer_input("How old are you? ", min_value=0, max_value=120)
print(f"Your age is: {user_age}")
num_items = get_integer_input("How many items do you want to buy? ", min_value=1)
print(f"You are buying {num_items} items.")
Why this is better:
- DRY (Don't Repeat Yourself): You can call this function anywhere you need an integer input.
- Flexible: The
min_valueandmax_valueare optional, so you can use it for any integer input. - Readable: The main part of your program is clean and easy to understand.
Checking Other Data Types
The same principles apply to floats and specific string formats.
Checking for a Float
def get_float_input(prompt, min_value=0.0):
while True:
try:
value = float(input(prompt))
if value < min_value:
print(f"Error: Value cannot be less than {min_value}.")
continue
return value
except ValueError:
print("Invalid input. Please enter a number (e.g., 12.5).")
price = get_float_input("Enter the price: ")
print(f"The price is ${price:.2f}")
Checking for a Specific String (e.g., Yes/No)
def get_yes_no_input(prompt):
while True:
user_input = input(prompt).strip().lower() # Clean and standardize input
if user_input in ['y', 'yes']:
return True
elif user_input in ['n', 'no']:
return False
else:
print("Invalid input. Please enter 'yes' or 'no'.")
# --- Example Usage ---
if get_yes_no_input("Are you sure you want to continue? (yes/no): "):
print("Action confirmed.")
else:
print("Action cancelled.")
.strip()removes leading/trailing whitespace..lower()converts the input to lowercase, soYes,YES, andyesare all treated the same.
Summary of Best Practices
- Always Assume
input()is a string. - Use
try-exceptblocks to handle type conversion errors (ValueError,TypeError). - Use a
while Trueloop to keep asking for input until it's valid. - Add logical checks for value ranges (
if/elif) after successful type conversion. - Create reusable functions for common input tasks to keep your code clean and DRY.
- Clean the input with
.strip()and.lower()when checking for specific string formats to improve user experience.
