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
finally
block 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