### 涓€绉嶇畝鍗曞鍣ㄥ拰鍑犱釜鐩稿叧鎿嶄綔

class Box:
    def __init__(self, elems=None):
        self._elems = elems[:] if elems else []

    def __len__(self):
        return len(self._elems)

    def __getitem__(self, ind):
        if not isinstance(ind, int):
            raise TypeError("Box index")
        if ind < 0 or ind > len(self._elems):
            raise IndexError("Box index")
        return self._elems[ind]

    def append(self, value):
        self._elems.append(value)

    def __setitem__(self, ind, value):
        if not isinstance(ind, int):
            raise TypeError("Box index")
        if ind < 0 or ind > len(self._elems):
            raise IndexError("Box index")
        self._elems[ind] = value

    def __contains__(self, item):
        return item in self._elems

    def __str__(self):
        return str(self._elems)

    def __iter__(self):
        for x in self._elems:
            yield x


### test code:
from random import randrange

def test_Box():
    b1 = Box([1, 2, 3, 4])
    b2 = Box()

    print(b1, "b1[2] is", b1[2])

    b1[2] = 10
    print(b1, "b1[2] is", b1[2])

    for i in range(10):
        b2.append(randrange(20))

    print(b2, "len(b2) is", len(b2))

    print("Numbers in b2 which are in [1, 15):")
    for i in range(5, 15):
        if i in b2:
            print(i)

    print("Even numbers in b2:")
    for x in b2:
        if x % 2 == 0:
            print(x)

#test_Box()


class Context:
    def __enter__(self):
        print("__enter__() executed")
        return self
 
    def __exit__(self, type, value, trace):
        print("__exit__() executed")

    def action(self):
        print("action() executed")
        return "action ends"
 
 
def test_with():
    with Context() as con:
        print("Context:", con.action())

test_with()