Zero to Python Hero - Part 3/10 : Understanding Type Casting, Operators, User Input and String formatting (with Code Examples)
Naveen- 0

Type Casting & Checking
What is Type Casting?
Type casting (also called type conversion) is the process of converting a value from one data type to another. It’s like translating between different languages – sometimes you need to convert a number to text, or text to a number, so different parts of your program can work together.
Why Do We Need Type Casting?
Here are common scenarios where type casting is essential:
- User Input: When users enter data, it’s always received as a string, even if they type numbers
- Mathematical Operations: You might need to convert between integers and floats for calculations
- Data Display: Converting numbers to strings for better formatting in output
- Data Validation: Checking if input can be converted to expected types
Checking Data Types with type()
Before we learn to convert types, let’s see how to check what type our data currently is:
# Sample variables of different types name = "Alice" age = 25 gpa = 3.85 is_student = True # Check their types print(type(name)) # <class 'str'> print(type(age)) # <class 'int'> print(type(gpa)) # <class 'float'> print(type(is_student)) # <class 'bool'>
Practical Example:
# Sometimes you're not sure what type your data is
mystery_value = 42
print(f"The value {mystery_value} is of type: {type(mystery_value)}")
# Output: The value 42 is of type: <class 'int'>
Explicit Type Casting
Explicit type casting means you manually convert data types using Python’s built-in functions.
1. Converting to Integer (int())
Converts values to whole numbers:
# Float to integer (decimal part is removed, not rounded!) grade = 87.9 grade_int = int(grade) print(grade_int) # Output: 87 (not 88!) # String to integer (only works with valid number strings) age_text = "25" age_number = int(age_text) print(age_number) # Output: 25 print(type(age_number)) # <class 'int'> # Boolean to integer is_active = True active_number = int(is_active) print(active_number) # Output: 1 (True becomes 1, False becomes 0)
2. Converting to Float (float())
Converts values to decimal numbers:
# Integer to float score = 95 score_float = float(score) print(score_float) # Output: 95.0 # String to float price_text = "29.99" price_number = float(price_text) print(price_number) # Output: 29.99 # Boolean to float has_discount = True discount_value = float(has_discount) print(discount_value) # Output: 1.0
3. Converting to String (str())
Converts any value to text:
# Integer to string
student_id = 12345
id_text = str(student_id)
print(f"Student ID: {id_text}") # Output: Student ID: 12345
print(type(id_text)) # <class 'str'>
# Float to string
temperature = 98.6
temp_text = str(temperature)
print(f"Temperature: {temp_text}°F") # Output: Temperature: 98.6°F
# Boolean to string
is_online = True
status_text = str(is_online)
print(f"Online status: {status_text}") # Output: Online status: True
4. Converting to Boolean (bool())
Converts values to True or False:
# Numbers to boolean
# Any non-zero number becomes True
positive_num = bool(42) # True
negative_num = bool(-10) # True
zero_num = bool(0) # False
print(positive_num) # True
print(zero_num) # False
# Strings to boolean
# Any non-empty string becomes True
name = bool("Alice") # True
empty_text = bool("") # False
space = bool(" ") # True (even just a space is not empty!)
print(name) # True
print(empty_text) # False
Real-World Example: Student Grade Calculator
Let’s see type casting in action with a practical example:
# Simulating user input (normally strings)
student_name = "Emma Johnson"
test_score_1 = "85" # String from user input
test_score_2 = "92.5" # String from user input
is_extra_credit = "True" # String from user input
# Convert strings to appropriate types for calculations
score_1 = int(test_score_1) # Convert to integer
score_2 = float(test_score_2) # Convert to float
extra_credit = bool(is_extra_credit) # Convert to boolean
# Calculate average
average = (score_1 + score_2) / 2
# Convert back to string for display
average_text = str(round(average, 1))
print("=" * 30)
print("STUDENT GRADE REPORT")
print("=" * 30)
print(f"Student: {student_name}")
print(f"Test 1: {score_1}")
print(f"Test 2: {score_2}")
print(f"Average: {average_text}")
print(f"Extra Credit: {extra_credit}")
Common Type Casting Scenarios
1. Working with User Input
# User input is always a string, even for numbers!
user_age = input("Enter your age: ") # This is a string
print(type(user_age)) # <class 'str'>
# Convert for mathematical operations
age_number = int(user_age)
years_until_30 = 30 - age_number
print(f"Years until 30: {years_until_30}")
2. Formatting Numbers for Display
# Converting numbers to strings for better formatting
price = 29.99
quantity = 3
total = price * quantity
# Convert to strings for custom formatting
total_formatted = f"${str(total)}"
print(f"Total cost: {total_formatted}")
3. Data Validation
# Check if a string can be converted to a number
def is_valid_number(text):
try:
float(text)
return True
except ValueError:
return False
# Test the function
print(is_valid_number("123")) # True
print(is_valid_number("12.5")) # True
print(is_valid_number("hello")) # False
Implicit Type Casting (Automatic)
Implicit type casting happens automatically when Python needs to make different data types work together:
# When you mix integers and floats in math operations x = 10 # Integer y = 3.5 # Float result = x + y # Python automatically converts to float print(result) # 13.5 print(type(result)) # <class 'float'> # Division always returns a float, even with integers a = 8 b = 2 division_result = a / b print(division_result) # 4.0 (not 4!) print(type(division_result)) # <class 'float'>
More Implicit Casting Examples:
# Integer and float operations
num1 = 5 # int
num2 = 2.0 # float
addition = num1 + num2 # Result: 7.0 (float)
multiplication = num1 * num2 # Result: 10.0 (float)
print(f"Addition: {addition} (type: {type(addition)})")
print(f"Multiplication: {multiplication} (type: {type(multiplication)})")
Type Casting Errors and How to Avoid Them
Common Errors:
# ❌ This will cause a ValueError
# invalid_conversion = int("hello") # Can't convert non-numeric string
# ❌ This will also cause a ValueError
# decimal_to_int = int("12.5") # Can't directly convert decimal string to int
# ✅ Safe ways to handle conversions:
# Method 1: Convert decimal string to float first, then to int
decimal_text = "12.5"
number = int(float(decimal_text)) # 12
# Method 2: Use try-except for error handling
def safe_int_conversion(text):
try:
return int(text)
except ValueError:
print(f"Cannot convert '{text}' to integer")
return None
result1 = safe_int_conversion("25") # Returns 25
result2 = safe_int_conversion("hello") # Returns None and prints error
Boolean Conversion Rules
Understanding when things become True or False:
# Numbers: 0 is False, everything else is True
print(bool(0)) # False
print(bool(1)) # True
print(bool(-1)) # True
print(bool(100)) # True
# Strings: Empty string is False, everything else is True
print(bool("")) # False
print(bool(" ")) # True (space is not empty!)
print(bool("hi")) # True
print(bool("0")) # True (this is a string, not the number 0)
# None is always False
print(bool(None)) # False
Practical Exercise: Temperature Converter
Here’s a complete example using type casting:
def temperature_converter():
print("Temperature Converter")
print("1. Celsius to Fahrenheit")
print("2. Fahrenheit to Celsius")
# Get user choice (string input)
choice = input("Choose option (1 or 2): ")
# Convert choice to integer for comparison
choice_num = int(choice)
if choice_num == 1:
# Celsius to Fahrenheit
celsius_str = input("Enter temperature in Celsius: ")
celsius = float(celsius_str) # Convert string to float
fahrenheit = (celsius * 9/5) + 32
# Convert result to string for formatted output
result = f"{str(celsius)}°C = {str(round(fahrenheit, 1))}°F"
print(result)
elif choice_num == 2:
# Fahrenheit to Celsius
fahrenheit_str = input("Enter temperature in Fahrenheit: ")
fahrenheit = float(fahrenheit_str) # Convert string to float
celsius = (fahrenheit - 32) * 5/9
# Convert result to string for formatted output
result = f"{str(fahrenheit)}°F = {str(round(celsius, 1))}°C"
print(result)
else:
print("Invalid choice!")
# Run the converter
# temperature_converter()
Key Takeaways
type()– Check what data type a variable isint()– Convert to integer (removes decimal part, doesn’t round)float()– Convert to decimal numberstr()– Convert anything to textbool()– Convert to True/False (0 and empty values become False)- Explicit casting — You manually convert using functions
- Implicit casting — Python automatically converts when needed
- User input is always strings — Convert to numbers for math operations
- Handle errors — Not all strings can be converted to numbers
- Division always returns float — Even 8/2 gives 4.0, not 4
Type casting is essential for working with user input, performing calculations, and formatting output. Practice with different combinations to get comfortable with when and how to convert between data types!
Python Operators
Operators in Python are special symbols used to perform operations on variables and values. Python supports several types of operators that allow you to manipulate data and create complex expressions. Let’s explore the main categories of operators:
Arithmetic Operators
Arithmetic operators are used with numeric values to perform common mathematical operations. Python supports the following arithmetic operators:
Basic Arithmetic Operations
Addition (+): The addition operator is used to add two values together.
a = 10 b = 5 result = a + b # result = 15
Subtraction (-): The subtraction operator is used to subtract one value from another.
a = 10 b = 3 result = a - b # result = 7
Multiplication (*): The multiplication operator is used to multiply two values.
a = 6 b = 4 result = a * b # result = 24
Division (/): The division operator is used to divide one value by another and returns a float result.
a = 10 b = 4 result = a / b # result = 2.5
Modulus (%): The modulus operator returns the remainder after division.
a = 10 b = 3 result = a % b # result = 1
Exponentiation ()**: The exponentiation operator raises a number to a power.
a = 2 b = 3 result = a ** b # result = 8 (2 to the power of 3)
Floor Division (//): The floor division operator performs division and returns the largest integer less than or equal to the result.
a = 10 b = 3 result = a // b # result = 3
The key difference between normal division (/) and floor division (//) is that normal division returns a float, while floor division returns an integer by rounding down to the nearest whole number.
Assignment Operators
Assignment operators are used to assign values to variables. The basic assignment operator is the equals sign (=), but Python also provides compound assignment operators that combine arithmetic operations with assignment.
Basic Assignment
x = 10 # Assigns the value 10 to variable x
Compound Assignment Operators
Addition Assignment (+=): Adds a value to the variable and assigns the result back to the variable.
a = 5 a += 3 # Equivalent to: a = a + 3 print(a) # Output: 8
Subtraction Assignment (-=): Subtracts a value from the variable and assigns the result back.
a = 10 a -= 4 # Equivalent to: a = a - 4 print(a) # Output: 6
Multiplication Assignment (*=): Multiplies the variable by a value and assigns the result back.
a = 6 a *= 2 # Equivalent to: a = a * 2 print(a) # Output: 12
Division Assignment (/=): Divides the variable by a value and assigns the result back.
a = 20 a /= 4 # Equivalent to: a = a / 4 print(a) # Output: 5.0
Comparison Operators
Comparison operators are used to compare two values and return a Boolean result (True or False). These operators are essential for making decisions in your programs.
Types of Comparison Operators
Equal to (==): Checks if two values are equal.
a = 5 b = 5 result = a == b # result = True
Not equal to (!=): Checks if two values are not equal.
a = 5 b = 3 result = a != b # result = True
Greater than (>): Checks if the left value is greater than the right value.
a = 8 b = 5 result = a > b # result = True
Less than (<): Checks if the left value is less than the right value.
a = 3 b = 7 result = a < b # result = True
Greater than or equal to (>=): Checks if the left value is greater than or equal to the right value.
a = 5 b = 5 result = a >= b # result = True
Less than or equal to (<=): Checks if the left value is less than or equal to the right value.
a = 4 b = 6 result = a <= b # result = True
Logical Operators
Logical operators are used to combine conditional statements and work with Boolean values. They allow you to create more complex conditions by combining multiple comparisons.
Types of Logical Operators
AND (and): Returns True if both conditions are true.
a = 10 result = (a > 5) and (a < 20) # result = True # Both conditions are satisfied: 10 > 5 is True AND 10 < 20 is True
OR (or): Returns True if at least one condition is true.
a = 25 result = (a > 50) or (a > 20) # result = True # First condition (25 > 50) is False, but second condition (25 > 20) is True
NOT (not): Returns the opposite Boolean value (reverses the result).
a = 5 result = not(a > 10) # result = True # a > 10 is False, so not(False) becomes True
Combining Logical Operators
You can combine multiple logical operators to create complex conditions:
a = 15 b = 8 result = (a > 10 and b < 10) or (a == b) # First part: (15 > 10 and 8 < 10) = (True and True) = True # Second part: (15 == 8) = False # Final result: True or False = True
Practical Examples
Here are some practical examples showing how these operators work together:
# Using multiple operator types
age = 25
salary = 50000
# Check if person is eligible for a loan
eligible = (age >= 18) and (salary > 30000)
print(f"Loan eligible: {eligible}") # Output: Loan eligible: True
# Calculate bonus with compound assignment
bonus = salary * 0.1
salary += bonus
print(f"New salary: {salary}") # Output: New salary: 55000.0
# Grade calculation using comparison operators
score = 85
if score >= 90:
grade = 'A'
elif score >= 80:
grade = 'B'
elif score >= 70:
grade = 'C'
else:
grade = 'F'
print(f"Grade: {grade}") # Output: Grade: B
Understanding these operators is fundamental to Python programming as they form the building blocks for creating logic, performing calculations, and making decisions in your programs. In the next sections, we’ll explore identity and membership operators to complete our understanding of Python’s operator system.
User Input in Python
Taking input from users is a crucial aspect of creating interactive Python programs. Instead of hardcoding values, we can make our programs dynamic by accepting user input and processing it accordingly.
The input() Function
Python provides the input() function to capture user input from the keyboard. This function displays a prompt message to the user and waits for them to enter a value.
Basic Syntax
variable_name = input("Enter your prompt message: ")
Important Note About input() Function
The input() function always returns a string, regardless of what the user enters. If you need a different data type (like integer or float), you must use type casting.
Practical Example: Voting Eligibility Checker
Let’s create a program that checks if a person is eligible to vote based on their age:
# Taking user input
age = input("Enter your age: ")
# Converting string to integer using type casting
age = int(age)
# Checking eligibility
if age >= 18:
print("You can give vote")
else:
print("You can't give vote")
We can also combine the input and type casting in a single line:
age = int(input("Enter your age: "))
Exception Handling for User Input
When taking user input, various errors can occur. For example, if we expect a number but the user enters text, our program will crash. To handle such situations gracefully, we use exception handling.
Understanding Try-Except-Finally Blocks
Exception handling in Python uses three main blocks:
- try block: Contains the code that might cause an error
- except block: Handles specific errors when they occur
- finally block: Executes regardless of whether an error occurred or not
Think of it this way:
- try block = Your body trying to do something
- except block = The doctor who diagnoses and treats the problem
- finally block = Your parents who are always there for you, regardless of the situation
Exception Handling Syntax
try:
# Code that might cause an error
risky_code_here()
except SpecificError:
# Handle the specific error
handle_error()
finally:
# This code always runs
cleanup_code()
Complete Example with Exception Handling
Here’s our voting eligibility checker with proper exception handling:
try:
# Taking user input and converting to integer
age = int(input("Enter your age: "))
# Checking voting eligibility
if age >= 18:
print("You can give vote")
else:
print("You can't give vote")
except ValueError:
# Handle the case when user enters non-numeric input
print("It wasn't a number")
finally:
# This always executes
print("Thank you")
Common Input Errors and Their Handling
ValueError
Occurs when trying to convert invalid input to a number:
try:
number = int(input("Enter a number: "))
print(f"You entered: {number}")
except ValueError:
print("Please enter a valid number")
Multiple Exception Types
You can handle different types of errors:
try:
age = int(input("Enter your age: "))
result = 100 / age
print(f"Result: {result}")
except ValueError:
print("Please enter a valid number")
except ZeroDivisionError:
print("Age cannot be zero")
finally:
print("Program completed")
Input for Different Data Types
String Input (Default)
name = input("Enter your name: ")
# No type casting needed as input() returns string by default
Integer Input
try:
age = int(input("Enter your age: "))
except ValueError:
print("Please enter a valid integer")
Float Input
try:
height = float(input("Enter your height in meters: "))
except ValueError:
print("Please enter a valid decimal number")
Boolean Input
response = input("Do you agree? (yes/no): ").lower()
agree = response in ['yes', 'y', 'true', '1']
Best Practices for User Input
- Always validate input: Use exception handling to prevent crashes
- Provide clear prompts: Tell users exactly what format you expect
- Give feedback: Let users know if their input was invalid
- Use appropriate data types: Convert input to the correct type for your program logic
- Handle edge cases: Consider what happens with empty input, spaces, etc.
Advanced Input Example
Here’s a more robust input function that keeps asking until valid input is received:
def get_valid_age():
while True:
try:
age = int(input("Enter your age (must be a positive number): "))
if age < 0:
print("Age cannot be negative. Please try again.")
continue
return age
except ValueError:
print("Please enter a valid number.")
# Using the function
user_age = get_valid_age()
print(f"Your age is: {user_age}")
Key Takeaways
- The
input()function always returns a string - Use type casting when you need other data types
- Always handle potential errors with try-except blocks
- The
finallyblock executes regardless of success or failure - Provide clear feedback to users about input requirements
- Validate and sanitize user input to prevent program crashes
User input makes your Python programs interactive and dynamic, but proper error handling ensures they remain robust and user-friendly.
f-Strings & String Formatting
F-strings are a modern and intuitive way to format strings in Python 3.6 and above. They offer a cleaner, more readable alternative to traditional string formatting methods like the .format() method.
What are f-Strings?
F-strings (formatted string literals) are created by prefixing a string with the letter f or F. They allow you to embed expressions directly within string literals using curly braces {}.
Basic f-String Usage
Simple Variable Insertion
first_name = "John"
last_name = "Doe"
# Traditional format method
message = "My name is {} {}".format(first_name, last_name)
# f-string approach
message = f"My name is {first_name} {last_name}"
The f-string approach is more intuitive because you can see exactly what variables are being inserted where, without having to cross-reference with a separate .format() method call.
Calling Methods Within f-Strings
F-strings can execute methods and functions directly within the placeholders:
first_name = "john"
last_name = "doe"
message = f"My name is {first_name.upper()} {last_name.upper()}"
# Output: "My name is JOHN DOE"
Working with Dictionaries
When accessing dictionary values in f-strings, be mindful of quote conflicts:
person = {"name": "Jen", "age": 23}
# Use double quotes for the string when accessing dict keys with single quotes
message = f"My name is {person['name']} and I am {person['age']} years old"
Mathematical Expressions
F-strings can perform calculations directly:
result = f"Four times eleven is equal to {4 * 11}"
# Output: "Four times eleven is equal to 44"
Advanced Formatting
Zero Padding
You can format numbers with zero padding using format specifiers:
for n in range(1, 11):
print(f"The value is {n:02}")
# Output: "The value is 01", "The value is 02", etc.
The :02 means zero-pad to 2 digits total.
Floating Point Precision
Control decimal precision with format specifiers:
import math
pi = math.pi
formatted_pi = f"Pi is equal to {pi:.4f}"
# Output: "Pi is equal to 3.1416"
The :.4f means 4 decimal places for a floating-point number.
Date Formatting
F-strings work excellently with datetime formatting:
from datetime import datetime
birthday = datetime(1990, 1, 1)
message = f"Jen has a birthday on {birthday:%B %d, %Y}"
# Output: "Jen has a birthday on January 01, 1990"
Common datetime format codes:
%B– Full month name%d– Day of the month (zero-padded)%Y– Four-digit year
Why Choose f-Strings?
- Readability: Variables and expressions are embedded directly where they appear in the output
- Performance: f-strings are faster than other formatting methods
- Flexibility: Support for expressions, method calls, and complex formatting
- Modern: The preferred approach in Python 3.6+
Best Practices
- Use double quotes for f-strings when accessing dictionary keys with single quotes
- Keep expressions within f-strings simple and readable
- For complex formatting, consider breaking it into multiple lines or variables
- Remember that f-strings are evaluated at runtime, so be mindful of performance in loops
F-strings represent a significant improvement in Python’s string formatting capabilities, making code more readable and maintainable while offering powerful formatting options.
Conclusion
In this comprehensive guide, we’ve covered six essential topics that form the foundation of every Python program you’ll ever write.
Let’s recap what you’ve accomplished:
Type Casting & Checking — You can convert between data types and verify what type you’re working with
Operators — You’ve mastered arithmetic, comparison, logical, and assignment operations
User Interaction — You can create interactive programs that respond to user input
String Formatting — You can create professional, dynamic output using f-strings
These concepts aren’t just theoretical knowledge — they’re the building blocks you’ll use in every Python program. Whether you’re building a simple calculator, analyzing data, creating web applications, or developing games, these fundamentals will be your constant companions.
If you haven’t read the previous Lessons, you can check it out below:
- Zero to Python Hero - Part 1/10: A Beginner guide to Python programming
- Zero to Python Hero - Part 2/10 : Understanding Python Variables, Data Types (with Code Examples)
Author
-
Naveen Pandey has more than 2 years of experience in data science and machine learning. He is an experienced Machine Learning Engineer with a strong background in data analysis, natural language processing, and machine learning. Holding a Bachelor of Science in Information Technology from Sikkim Manipal University, he excels in leveraging cutting-edge technologies such as Large Language Models (LLMs), TensorFlow, PyTorch, and Hugging Face to develop innovative solutions.
View all posts
