type() — get exact type

x = 5
print(type(x))  # 

y = "hello"
print(type(y))  # 

# Compare types:
if type(x) == int:
    print("x is an integer")

isinstance() — check type (preferred)

isinstance() is usually better because it handles inheritance:

x = 5

# Check if x is int:
if isinstance(x, int):
    print("x is an integer")

# Check multiple types:
if isinstance(x, (int, float)):
    print("x is a number")

Why isinstance() is better

isinstance() works with inheritance, type() doesn't:

class Animal:
    pass

class Dog(Animal):
    pass

my_dog = Dog()

# isinstance handles inheritance:
print(isinstance(my_dog, Dog))  # True
print(isinstance(my_dog, Animal))  # True (Dog inherits from Animal)

# type() doesn't:
print(type(my_dog) == Dog)  # True
print(type(my_dog) == Animal)  # False (exact type only)

Common use cases

def process_data(data):
    if isinstance(data, list):
        return sum(data)
    elif isinstance(data, dict):
        return len(data)
    else:
        return "Unknown type"

print(process_data([1, 2, 3]))  # 6
print(process_data({'a': 1}))  # 1