Python Data Types

When I started working with Python over a decade ago, one of the first things I had to understand was the concept of data types. This knowledge forms the foundation for everything you will ever build with Python.

Data types in Python categorize the type of value a variable can hold and determine the operations that can be performed on that data. Unlike other programming languages, Python is dynamically typed, so you don’t need to declare the type when creating variables.

In this tutorial, I’ll explain all the essential Python data types, providing clear examples so you can start building powerful applications immediately. Additionally, you will find numerous tutorials on useful data types in Python.

Numeric Data Types in Python

Python Integers (int)

Integers in Python represent whole numbers without decimal points. They can be positive, negative, or zero. In Python, integers have unlimited precision, which means there’s no maximum or minimum value – they can be as large as your computer’s memory allows.

# Creating integer variables
employee_count = 157
annual_revenue = 5000000
temperature = -10

When working with integers, you can perform all standard arithmetic operations:

# Addition
total_employees = employee_count + 43  # 200

# Subtraction
remaining_budget = annual_revenue - 2500000  # 2500000

# Multiplication
double_revenue = annual_revenue * 2  # 10000000

# Division (returns float)
avg_revenue_per_employee = annual_revenue / employee_count  # 31847.13

# Floor division (returns int)
avg_revenue_thousands = annual_revenue // 1000  # 5000

# Modulus (remainder)
remainder = 157 % 10  # 7

# Exponentiation
squared = employee_count ** 2  # 24649

Converting other data types to integers is straightforward using the int() function:

# String to integer
sales_string = "25000"
sales_integer = int(sales_string)  # 25000

# Float to integer (truncates decimal part)
average_rating = int(4.7)  # 4

# Boolean to integer
is_active = True
active_as_int = int(is_active)  # 1 (True converts to 1, False to 0)

In real-world applications, I use integers for:

  • Employee IDs and user identification
  • Counting items in inventory
  • Representing whole numbers in financial calculations
  • Array/list indexing and slicing
  • Representing dates and times (as timestamps)
  • HTTP status codes in web applications

One important thing to note is that in Python 3, division between two integers (like 5/2) returns a float (2.5), unlike Python 2, where it would perform integer division. If you need integer division, use the floor division operator (//).

Integer-related tutorial:

Number-related tutorials

Floats represent real numbers with decimal points or numbers in scientific notation. They’re essential for any calculation requiring precision beyond whole numbers.

Python Floating-Point Numbers (float)

# Basic float examples
product_price = 49.99
tax_rate = 0.08
temperature = 98.6
scientific_notation = 6.022e23  # Avogadro's number

Floating-point operations mirror those available for integers:

# Basic arithmetic
total_price = product_price + (product_price * tax_rate)  # 53.9892
discount_price = product_price * 0.9  # 44.991

# Rounding floats
rounded_price = round(product_price, 1)  # 50.0
rounded_total = round(total_price, 2)  # 53.99

# Converting temperature from Fahrenheit to Celsius
celsius = (temperature - 32) * 5/9  # 37.0

You can convert other data types to floats using the float() function:

# String to float
price_string = "19.99"
price_float = float(price_string)  # 19.99

# Integer to float
count = 42
count_float = float(count)  # 42.0

Floating-point precision issues are important to understand. Due to how computers represent decimal numbers in binary, some calculations may not be as precise as you’d expect:

print(0.1 + 0.2)  # 0.30000000000000004 instead of exactly 0.3

For financial calculations or when precise decimal arithmetic is required, I use the decimal module:

from decimal import Decimal, getcontext

# Set precision
getcontext().prec = 4

# Exact decimal calculations
exact_sum = Decimal('0.1') + Decimal('0.2')  # Decimal('0.3')

# Financial calculation
loan_amount = Decimal('10000.00')
interest_rate = Decimal('0.0325')
yearly_interest = loan_amount * interest_rate
print(yearly_interest)  # Decimal('325.0')

In my work, I use floats for:

  • Prices and financial calculations (with care)
  • Scientific measurements and calculations
  • Probabilities and statistical values
  • Representing coordinates in graphics or mapping
  • Time measurements with fractional parts
  • Machine learning model parameters and metrics

Float-related tutorial:

Sequence Data Types in Python

Python Strings (str)

Strings are sequences of characters, and they’re one of the most versatile data types in Python. They can be defined using single quotes ('), double quotes ("), or triple quotes (''' or """) for multi-line strings.

# Different ways to create strings
first_name = "Sarah"
last_name = 'Johnson'
address = """123 Main Street
New York, NY 10001"""
quote = 'She said, "Python is amazing!"'

Strings in Python are immutable, meaning once created, you cannot change their contents. Any operation that appears to modify a string creates a new string.

Accessing characters in strings is done via indexing, which starts at 0:

name = "Python"
first_char = name[0]  # 'P'
last_char = name[-1]  # 'n'

# Slicing gets a portion of the string
substring = name[1:4]  # 'yth'
first_three = name[:3]  # 'Pyt'
last_three = name[-3:]  # 'hon'
reversed_string = name[::-1]  # 'nohtyP'

Python offers powerful string methods that simplify text processing:

email = "SARAH.JOHNSON@EXAMPLE.COM"

# Case conversion
lower_email = email.lower()  # 'sarah.johnson@example.com'
upper_name = first_name.upper()  # 'SARAH'
title_case = "john smith".title()  # 'John Smith'

# Finding and replacing
has_com = email.endswith('.COM')  # True
position = email.find('JOHNSON')  # 6
new_domain = email.replace('EXAMPLE.COM', 'COMPANY.ORG')  # 'SARAH.JOHNSON@COMPANY.ORG'

# Splitting and joining
full_name = "Sarah J. Johnson"
name_parts = full_name.split()  # ['Sarah', 'J.', 'Johnson']
comma_separated = ", ".join(name_parts)  # 'Sarah, J., Johnson'

# Removing whitespace
username = "  sarah_j  "
clean_username = username.strip()  # 'sarah_j'

# Checking content
is_alpha = first_name.isalpha()  # True
is_numeric = "12345".isdigit()  # True
starts_with = email.startswith('SARAH')  # True

String formatting is essential for creating dynamic text:

# f-strings (Python 3.6+)
age = 32
message = f"{first_name} is {age} years old."  # 'Sarah is 32 years old.'

# With formatting specifications
pi = 3.14159
formatted_pi = f"Pi to 2 decimal places: {pi:.2f}"  # 'Pi to 2 decimal places: 3.14'

# format() method
template = "{} lives in {}, {}"
location = template.format(full_name, "New York", "NY")  # 'Sarah J. Johnson lives in New York, NY'

# % operator (older style)
old_style = "%s has $%.2f in their account" % ("Sarah", 1234.56)  # 'Sarah has $1234.56 in their account'

Strings are used in virtually every Python program for:

  • User data and input processing
  • File content manipulation
  • Web content (HTML, JSON, XML)
  • Database queries
  • Configuration settings
  • Output formatting and display
  • Regular expression pattern matching

Python Lists

Python Lists are ordered, mutable collections that can contain items of any data type, including other lists. They’re one of Python’s most flexible data structures.

# Creating lists
empty_list = []
shopping_list = ["milk", "eggs", "bread", "apples", "coffee"]
mixed_list = [1, "hello", 3.14, True, [1, 2, 3]]

Lists offer numerous ways to access and modify their contents:

# Accessing elements by index
first_item = shopping_list[0]  # 'milk'
last_item = shopping_list[-1]  # 'coffee'

# List slicing
first_three = shopping_list[:3]  # ['milk', 'eggs', 'bread']
middle_items = shopping_list[1:4]  # ['eggs', 'bread', 'apples']
every_other = shopping_list[::2]  # ['milk', 'bread', 'coffee']

# Modifying lists
shopping_list[0] = "almond milk"  # Replace an item
shopping_list.append("cheese")  # Add to the end
shopping_list.insert(1, "yogurt")  # Insert at index 1
shopping_list.extend(["butter", "juice"])  # Add multiple items
popped_item = shopping_list.pop()  # Remove and return the last item
shopping_list.remove("bread")  # Remove first occurrence of 'bread'

# Finding items
bread_index = shopping_list.index("bread")  # Find the index of 'bread'
coffee_count = shopping_list.count("coffee")  # Count occurrences of 'coffee'

# Sorting and reversing
shopping_list.sort()  # Sort in place alphabetically
shopping_list.sort(reverse=True)  # Sort in descending order
shopping_list.reverse()  # Reverse the list in place

# Sorted copy without modifying original
sorted_list = sorted(shopping_list)

# List comprehensions
numbers = [1, 2, 3, 4, 5]
squares = [n**2 for n in numbers]  # [1, 4, 9, 16, 25]
even_squares = [n**2 for n in numbers if n % 2 == 0]  # [4, 16]

Nested lists can be used to create multi-dimensional data structures:

# 2D list (matrix)
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# Accessing elements in a 2D list
middle_element = matrix[1][1]  # 5

List operations and built-in functions:

# Concatenation
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = list1 + list2  # [1, 2, 3, 4, 5, 6]

# Repetition
repeated = list1 * 3  # [1, 2, 3, 1, 2, 3, 1, 2, 3]

# List length
item_count = len(shopping_list)

# Min and max
lowest = min([10, 5, 23, 16])  # 5
highest = max([10, 5, 23, 16])  # 23
total = sum([10, 5, 23, 16])  # 54

# Checking if items exist in a list
has_apples = "apples" in shopping_list  # True or False depending on list contents

Lists are extremely versatile in real-world Python applications. I use them for:

  • Managing collections of user data (names, emails, etc.)
  • Storing API response data for processing
  • Tracking product inventory and details
  • Creating data pipelines where items are processed sequentially
  • Building navigation menus and UI elements in applications
  • Storing historical data like price changes or user activity
  • Managing task queues and processing workflows

Lists do have some performance considerations. While they’re excellent for general-purpose use, operations like insertion or deletion in the middle of large lists can be slow because all subsequent elements need to be shifted. For these cases, I sometimes use alternative data structures like collections.deque.

When working with large datasets, numpy arrays often provide better performance than standard Python lists, especially for numerical operations:

import numpy as np

# Creating a numpy array from a list
numpy_array = np.array([1, 2, 3, 4, 5])
squares = numpy_array ** 2  # Efficient element-wise operation: [1, 4, 9, 16, 25]

Boolean Data Type (bool)

The Boolean data type represents one of two values: True or False. These values are essential for controlling program flow, making decisions, and evaluating conditions.

# Basic boolean values
is_logged_in = True
has_premium_account = False

Booleans result from comparison operations:

# Comparison operators
age = 25
is_adult = age >= 18  # True
is_senior = age >= 65  # False
names_match = "Sarah" == "sarah"  # False (case-sensitive)

Boolean logic operations allow you to combine conditions:

# Logical operators
can_access_premium = is_logged_in and has_premium_account  # False
can_view_content = is_logged_in or has_premium_account  # True
is_regular_user = not has_premium_account  # True

# Complex conditions
is_target_demographic = (age >= 18 and age <= 35) and is_logged_in  # True

In Python, all objects have an implicit boolean value that can be used in conditional statements:

# Truthy and falsy values
empty_string = ""
if not empty_string:  # Empty strings are falsy
    print("Please enter your name")

user_list = []
if not user_list:  # Empty lists are falsy
    print("No users found")

# Common falsy values
# False, None, 0, 0.0, "", [], {}, set()

# Everything else is truthy
non_zero = 42
if non_zero:  # Non-zero numbers are truthy
    print("Value exists")

You can convert other types to Boolean using the bool() function:

# Converting to boolean
print(bool(0))      # False
print(bool(42))     # True
print(bool(""))     # False
print(bool("Hello")) # True
print(bool([]))     # False
print(bool([1, 2])) # True

In my development work, booleans are crucial for:

  • User authentication logic
  • Access control and permissions
  • Form validation
  • Feature flags and toggles
  • Data filtering criteria
  • Error handling and exception control
  • Conditional UI rendering
  • Testing assertions and conditions

Understanding Boolean logic is fundamental to writing effective conditional statements and creating robust program flow.

Boolean-related tutorial:

Dictionary Data Type (dict)

Python Dictionaries are incredibly versatile key-value stores that allow you to create mappings between keys and their associated values. Unlike sequences that are indexed by numbers, dictionaries use keys (typically strings) to access values.

# Creating dictionaries
empty_dict = {}
user = {
    "id": 12345,
    "username": "sarah_j",
    "email": "sarah.j@example.com",
    "is_active": True,
    "age": 32
}

# Nested dictionaries
customer = {
    "name": "John Smith",
    "orders": {
        "2023-01-15": {"item": "Laptop", "price": 1299.99},
        "2023-03-20": {"item": "Headphones", "price": 149.95}
    },
    "preferences": {
        "notifications": True,
        "theme": "dark"
    }
}

Accessing and manipulating dictionary data is straightforward:

# Accessing values
print(user["username"])  # 'sarah_j'

# Using get() for safe access (returns None or default if key doesn't exist)
print(user.get("location"))  # None
print(user.get("location", "Unknown"))  # 'Unknown'

# Adding or updating values
user["phone"] = "555-123-4567"
user["age"] = 33  # Updates existing key

# Removing items
removed_email = user.pop("email")  # Removes and returns the value
del user["age"]  # Removes the key-value pair

# Checking if a key exists
has_username = "username" in user  # True

Dictionary methods provide powerful ways to work with this data structure:

# Getting all keys, values, or items
keys_list = list(user.keys())  # ['id', 'username', 'is_active', 'phone']
values_list = list(user.values())  # [12345, 'sarah_j', True, '555-123-4567']
items_list = list(user.items())  # [('id', 12345), ('username', 'sarah_j'), ...]

# Merging dictionaries
defaults = {"language": "English", "timezone": "UTC"}
user.update(defaults)  # Adds these key-values to user dictionary

# Dictionary comprehensions
squares_dict = {x: x**2 for x in range(1, 6)}  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# Filtering with comprehensions
adult_users = {
    name: age for name, age in {"Alice": 25, "Bob": 17, "Charlie": 30}.items() 
    if age >= 18
}  # {'Alice': 25, 'Charlie': 30}

For nested dictionaries, you can access nested values by chaining keys:

# Accessing nested data
laptop_price = customer["orders"]["2023-01-15"]["price"]  # 1299.99
theme = customer["preferences"]["theme"]  # 'dark'

# Safely accessing nested data
notification_setting = customer.get("preferences", {}).get("notifications")

In my professional work, dictionaries are essential for:

  • Configuration settings and application parameters
  • Processing JSON data from APIs
  • Database query results representation
  • Form data management
  • Caching frequently accessed data
  • Implementing lookup tables and mappings
  • Creating data transformations
  • Building flexible data structures

Dictionaries are memory-efficient for lookups, with near-constant time complexity for access operations, making them ideal for scenarios where you need to quickly find values based on a key.

Tuple Data Type (tuple)

Python Tuples are ordered, immutable sequences similar to lists, but with a critical difference: once created, tuples cannot be modified. This immutability makes them useful for representing fixed collections of items.

# Creating tuples
empty_tuple = ()
single_item_tuple = (42,)  # Note the comma is required for single-item tuples
coordinates = (40.7128, -74.0060)  # New York coordinates
rgb_color = (255, 0, 127)
mixed_tuple = (1, "hello", True)

# Tuples can also be created without parentheses
another_tuple = 1, 2, 3, 4, 5

Accessing tuple elements works just like with lists:

# Accessing elements
x, y = coordinates  # Tuple unpacking
first_value = coordinates[0]  # 40.7128
last_value = coordinates[-1]  # -74.0060

# Slicing
first_three = another_tuple[:3]  # (1, 2, 3)

While tuples are immutable, they can contain mutable objects:

# Tuple with mutable elements
student = ("John", ["Math", "Physics"], 21)
student[1].append("Chemistry")  # The list inside the tuple can be modified
print(student)  # ('John', ['Math', 'Physics', 'Chemistry'], 21)

Tuple methods and operations:

# Count occurrences of an element
repeat_tuple = (1, 2, 3, 1, 4, 1)
count_of_ones = repeat_tuple.count(1)  # 3

# Find index of first occurrence
position = repeat_tuple.index(3)  # 2

# Length of tuple
size = len(coordinates)  # 2

# Concatenation
combined = coordinates + rgb_color  # (40.7128, -74.0060, 255, 0, 127)

Tuples have several advantages in specific scenarios:

  1. Performance: Tuples are slightly more memory-efficient and faster than lists.
  2. Dictionary Keys: Unlike lists, tuples can be used as dictionary keys because they’re immutable.
  3. Multiple Return Values: Functions can easily return multiple values as tuples.
  4. Data Integrity: When you don’t want data to be accidentally modified.

Here’s how I use tuples in real applications:

# Tuples as dictionary keys
city_data = {
    (40.7128, -74.0060): "New York",
    (34.0522, -118.2437): "Los Angeles",
    (41.8781, -87.6298): "Chicago"
}
print(city_data[coordinates])  # "New York"

# Function returning multiple values
def get_user_stats(user_id):
    # Imagine this fetches data from a database
    return ("Sarah Johnson", 32, "New York")

name, age, city = get_user_stats(12345)  # Tuple unpacking

# Named tuples for more readable code
from collections import namedtuple
Person = namedtuple('Person', ['name', 'age', 'city'])
user = Person("Sarah", 32, "New York")
print(user.name)  # 'Sarah'
print(user.city)  # 'New York'

I regularly use tuples for:

  • Geographic coordinates (latitude, longitude)
  • RGB or RGBA color values
  • Database records where values shouldn’t change
  • Configuration settings that should remain constant
  • Function returns values with multiple components
  • As keys in a dictionary, when the key needs multiple components

Set Data Type (set)

Python Sets are unordered collections of unique elements. Unlike lists or tuples, sets automatically eliminate duplicates and focus on membership operations rather than sequence.

The key characteristics of sets include:

# Creating sets
empty_set = set()  # Note: {} creates an empty dictionary, not a set
colors = {"red", "green", "blue"}
numbers = {1, 2, 3, 4, 5}
mixed_set = {1, "hello", (1, 2, 3)}  # Can contain different immutable types

Sets are extremely efficient for membership testing. When I need to check if a value exists in a collection, sets provide near-constant time lookups regardless of size:

# Membership testing (very fast)
is_red_present = "red" in colors  # True
is_yellow_present = "yellow" in colors  # False

I frequently use sets to eliminate duplicates from sequences:

# Removing duplicates
customer_ids = [1001, 1002, 1001, 1003, 1002, 1004, 1005, 1001]
unique_customers = set(customer_ids)  # {1001, 1002, 1003, 1004, 1005}
unique_count = len(unique_customers)  # 5

# Converting back to a list if needed
unique_customer_list = list(unique_customers)

For modifying sets, these operations are available:

# Adding elements
colors.add("yellow")  # {'red', 'green', 'blue', 'yellow'}
colors.update(["purple", "orange"])  # Add multiple items

# Removing elements
colors.remove("green")  # Raises KeyError if not found
colors.discard("black")  # No error if not found
popped_item = colors.pop()  # Removes and returns an arbitrary element
colors.clear()  # Removes all elements

Where sets truly shine is in mathematical set operations:

east_coast_states = {"New York", "New Jersey", "Connecticut", "Massachusetts"}
new_england_states = {"Maine", "Vermont", "New Hampshire", "Massachusetts", "Connecticut", "Rhode Island"}

# Set operations
intersection = east_coast_states & new_england_states  # Common elements: {'Connecticut', 'Massachusetts'}
union = east_coast_states | new_england_states  # All unique elements from both sets
difference = east_coast_states - new_england_states  # Elements in east_coast but not in new_england: {'New York', 'New Jersey'}
symmetric_difference = east_coast_states ^ new_england_states  # Elements in either set but not both

# Method equivalents
intersection = east_coast_states.intersection(new_england_states)
union = east_coast_states.union(new_england_states)
difference = east_coast_states.difference(new_england_states)
symmetric_difference = east_coast_states.symmetric_difference(new_england_states)

Sets also support subset and superset relationships:

northeast_states = {"Maine", "New Hampshire", "Vermont", "New York", "Massachusetts", "Rhode Island", "Connecticut", "New Jersey", "Pennsylvania"}

# Subset/superset testing
is_subset = new_england_states.issubset(northeast_states)  # True
is_superset = northeast_states.issuperset(new_england_states)  # True

For immutable sets, Python provides the frozenset type:

# Immutable set
immutable_colors = frozenset(["red", "green", "blue"])
# immutable_colors.add("yellow")  # Would raise AttributeError

# Can be used as dictionary keys or in other sets
color_properties = {
    frozenset(["red", "green", "blue"]): "RGB primary colors",
    frozenset(["cyan", "magenta", "yellow", "black"]): "CMYK colors"
}

In my professional work, I use sets for:

  • Filtering duplicate records from databases or API responses
  • Tracking unique values like user IDs, email addresses, or product codes
  • Computing differences between data collections (what’s in A but not in B)
  • Implementing access control by checking if permissions exist in a user’s permission set
  • Finding common elements between collections
  • Creating data pipelines where I need to ensure uniqueness
  • Efficient membership testing in large collections

Set comprehensions provide a concise way to create sets based on existing collections:

# Set comprehension
squared_evens = {x**2 for x in range(10) if x % 2 == 0}  # {0, 4, 16, 36, 64}

Remember that sets have some limitations:

  1. Sets are unordered (though as of Python 3.7, they maintain insertion order, but you shouldn’t rely on this)
  2. Sets can only contain hashable (immutable) elements – no lists or dictionaries
  3. You can’t access elements by index since sets aren’t sequences

Other Important Python Data Types

None Type (NoneType)

None is a special singleton object that represents the absence of a value or a null reference. It’s often used as a default return value for functions that don’t explicitly return anything.

# Using None
def fetch_user_profile(user_id):
    # Imaginary database lookup
    if user_id == 12345:
        return {"name": "Sarah", "email": "sarah@example.com"}
    else:
        return None  # User not found

profile = fetch_user_profile(99999)
if profile is None:
    print("User not found")

When checking for None, always use identity operators (is, is not) rather than equality operators (==, !=):

# Correct way to check for None
if response is None:
    print("No response received")

# Incorrect way
if response == None:  # Works but not recommended
    print("No response received")

I use None for:

  • Representing optional function parameters
  • Indicating the absence of a return value
  • Placeholder values in data structures
  • The default initialization of variables that will be assigned later
  • Representing null database values

Non-related tutorial:

Complex Numbers (complex)

Complex numbers consist of a real and imaginary part and are useful in scientific and engineering applications:

# Creating complex numbers
z1 = 3 + 4j  # Direct notation
z2 = complex(2, -3)  # Using the complex() function

# Complex properties and operations
print(z1.real)  # 3.0
print(z1.imag)  # 4.0
print(abs(z1))  # 5.0 (magnitude)
print(z1.conjugate())  # 3-4j

# Arithmetic with complex numbers
z3 = z1 + z2  # (5+1j)
z4 = z1 * z2  # (18+1j)

Complex numbers are essential for:

  • Signal processing algorithms
  • Electrical engineering calculations
  • Quantum computing simulations
  • Advanced mathematical modeling
  • Fourier transforms and spectral analysis

Complex Numbers-related tutorial:

Type Conversion in Python

Python makes it easy to convert between different data types:

# Basic type conversions
integer_value = int("42")  # String to int: 42
float_value = float("3.14159")  # String to float: 3.14159
string_value = str(42)  # Int to string: "42"
boolean_value = bool(1)  # Int to bool: True
list_from_string = list("Python")  # String to list: ['P', 'y', 't', 'h', 'o', 'n']
tuple_from_list = tuple([1, 2, 3])  # List to tuple: (1, 2, 3)
set_from_list = set([1, 2, 2, 3, 3, 3])  # List to set: {1, 2, 3}

When converting between types, be aware of potential data loss or exceptions:

# Potential issues in type conversion
try:
    number = int("abc")  # Raises ValueError
except ValueError:
    print("Conversion failed: not a valid integer")

# Truncation when converting float to int
truncated = int(9.9)  # 9 (decimal part is lost)

# Boolean conversion rules
print(bool(0))  # False
print(bool(""))  # False
print(bool([]))  # False
print(bool(42))  # True
print(bool("Hello"))  # True

For more complex conversions between collection types, consider these patterns:

# Converting between collection types
my_list = [1, 2, 3, 4]
my_tuple = tuple(my_list)
my_set = set(my_tuple)
my_list_again = list(my_set)

# Dictionary conversions
items = [("name", "Sarah"), ("age", 32), ("city", "New York")]
dict_from_items = dict(items)  # {'name': 'Sarah', 'age': 32, 'city': 'New York'}

# Converting dictionaries to other types
keys_list = list(dict_from_items.keys())
values_list = list(dict_from_items.values())
items_list = list(dict_from_items.items())

Find the Type of a Variable in Python

Python provides several ways to determine the type of a variable:

# Using the type() function
name = "Sarah"
age = 32
active = True

print(type(name))  # <class 'str'>
print(type(age))   # <class 'int'>
print(type(active))  # <class 'bool'>

# Type checking in conditionals
if isinstance(name, str):
    print("Name is a string")
    
if isinstance(age, (int, float)):  # Check against multiple types
    print("Age is a number")

The isinstance() function is generally preferred over direct type comparisons because it respects inheritance:

# isinstance() respects inheritance
class Animal:
    pass

class Dog(Animal):
    pass

my_dog = Dog()
print(isinstance(my_dog, Dog))    # True
print(isinstance(my_dog, Animal))  # True - respects inheritance

# Direct type comparison doesn't respect inheritance
print(type(my_dog) is Dog)    # True
print(type(my_dog) is Animal)  # False - doesn't respect inheritance

Variable-related tutorials:

Conclusion

If you want to write error-free code, then as a Python developer, you should understand data types in Python. Each data type has its own strengths and appropriate use cases:

  • Integers and Floats: For numerical calculations and representing quantities
  • Strings: For text processing and representation
  • Lists: For ordered, mutable collections
  • Tuples: For immutable sequences of related values
  • Dictionaries: For key-value mappings and structured data
  • Sets: For unique collections and membership operations
  • Booleans: For logical operations and control flow
  • None: For representing the absence of a value

By choosing the right data type for each situation, you can write more efficient, readable, and maintainable Python code. As you become more experienced, you’ll develop an intuition for which data type best fits each problem you’re solving.

What Python data type do you find yourself using most often in your projects? Let me know in the comments below!

51 Python Programs

51 PYTHON PROGRAMS PDF FREE

Download a FREE PDF (112 Pages) Containing 51 Useful Python Programs.

Let’s be friends

Be the first to know about sales and special discounts.