Comprehensions in Python
1. Introduction
Comprehensions provide a concise way to create collections in Python. They can replace the need for traditional loops while maintaining readability.
2. List Comprehensions
List comprehensions allow you to create lists in a single line of code.
numbers = [1, 2, 3, 4, 5]
squared = [x ** 2 for x in numbers]
print(squared)  # Output: [1, 4, 9, 16, 25]
            This example generates a list of squared values from the original list.
even_squared = [x ** 2 for x in numbers if x % 2 == 0]
print(even_squared)  # Output: [4, 16]
        3. Dictionary Comprehensions
Dictionary comprehensions are similar to list comprehensions but create dictionaries instead.
keys = ['a', 'b', 'c']
values = [1, 2, 3]
my_dict = {k: v for k, v in zip(keys, values)}
print(my_dict)  # Output: {'a': 1, 'b': 2, 'c': 3}
        4. Set Comprehensions
Set comprehensions allow you to create sets in a similar fashion.
unique_squared = {x ** 2 for x in numbers}
print(unique_squared)  # Output: {1, 4, 9, 16, 25}
        5. Generator Expressions
Generator expressions are similar to comprehensions but return an iterator instead of a list.
gen = (x ** 2 for x in numbers)
for value in gen:
    print(value)  # Outputs: 1, 4, 9, 16, 25
        6. Best Practices
Here are some best practices to follow:
- Keep comprehensions readable; avoid complex expressions.
 - Use comprehensions when they simplify your code.
 - Prefer generator expressions for large datasets to save memory.
 
7. FAQ
What is the difference between a list and a generator comprehension?
A list comprehension creates a list in memory, while a generator expression returns an iterator that generates items on-the-fly, saving memory.
Can you use multiple loops in comprehensions?
Yes! You can nest loops in comprehensions.
cartesian_product = [(x, y) for x in [1, 2] for y in [3, 4]]
print(cartesian_product)  # Output: [(1, 3), (1, 4), (2, 3), (2, 4)]
            