from collections import namedtuple # Define a namedtuple for a Point (x, y coordinates) Point = namedtuple('Point', ['x', 'y']) # Create instances of Point p1 = Point(10, 20) p2 = Point(x=30, y=40) print(f"Point 1: {p1}") # Output: Point 1: Point(x=10, y=20) print(f"Point 2: {p2}") # Output: Point 2: Point(x=30, y=40) # Access elements by name (like a dictionary key) print(f"P1 x-coordinate: {p1.x}") # Output: P1 x-coordinate: 10 print(f"P2 y-coordinate: {p2.y}") # Output: P2 y-coordinate: 40 # Access elements by index (like a tuple) print(f"P1 y-coordinate (by index): {p1[1]}") # Output: P1 y-coordinate (by index): 20 # namedtuple instances are immutable (like tuples) try: p1.x = 15 except AttributeError as e: print(f" Error trying to modify a namedtuple: {e}") # Output: Error trying to modify a namedtuple: can't set attribute # namedtuple is lightweight compared to a full class # Can be converted to dictionary print(f"P1 as dictionary: {p1._asdict()}") # Output: P1 as dictionary: {'x': 10, 'y': 20} # Replace fields to create a new instance (immutability-friendly update) p1_new = p1._replace(x=15) print(f"P1 original: {p1}, P1 with x replaced: {p1_new}") # Output: P1 original: Point(x=10, y=20), P1 with x replaced: Point(x=15, y=20) # Use cases: Database records, structured API responses, configuration settings # Define a namedtuple for a Car record Car = namedtuple('Car', 'make model year color') car1 = Car('Toyota', 'Camry', 2020, 'Blue') print(f"Car 1: {car1}") # Output: Car 1: Car(make='Toyota', model='Camry', year=2020, color='Blue') print(f"Car 1 make: {car1.make}") # Output: Car 1 make: Toyota