Menu
CoddyTech

Toán tử cơ bản

Bài học 12 trên 29 trong khóa học Dự án máy tính bằng Python của Coddy.

Bước tiếp theo là cấu trúc danh sách thành cấu trúc cơ bản của chúng ta.

Trước tiên, hãy xét phép tính 1 + 2 + 3. Ta chuyển phép tính thành danh sách [1, '+', 2, '+', 3], sau đó cấu trúc danh sách theo dạng mà hàm eval nhận vào: ['+',  ['+', 1, 2], 3].

Ở bước này, ta chỉ cần cấu trúc danh sách theo định dạng mà hàm eval nhận vào.

Ví dụ:

  • [4.5, '-', 3]  ->  ['-', 4.5, 3]
  • [4.5, '-', 3, '+', 2]  ->  ['+', ['-', 4.5, 3], 2]
  • [1, 'sub', 2, 'add', 3, '+', 4]  ->  ['+', ['add', ['sub', 1, 2], 3], 4]
challenge icon

Thử thách

Trung bình

Tạo hàm struct nhận danh sách ở định dạng trên và trả về định dạng phù hợp với hàm eval.

Hiện tại, chỉ xử lý các toán tử cơ bản '+' và '-'.

Tự làm thử

def calc(op, n1, n2=None):
    if not isinstance(n1, int) and not isinstance(n1, float):
        raise Exception('Invalid number "' + str(n1) + '"')

    if n2 is None:
        if op == '+' or op == 'add':
            return n1
        if op == '-' or op == 'sub':
            return -n1

        raise Exception('Invalid operator "' + op + '"')

    if not isinstance(n2, int) and not isinstance(n2, float):
        raise Exception('Invalid number "' + str(n2) + '"')

    if op == '+' or op == 'add':
        return n1 + n2
    if op == '-' or op == 'sub':
        return n1 - n2
    if op == '*' or op == 'mul':
        return n1 * n2
    if op == '/' or op == 'div':
        if n2 == 0:
            raise Exception("Division by zero")
        return n1 / n2
    if op == '%' or op == 'mod':
        if n2 == 0:
            raise Exception("Division by zero")
        return n1 % n2
    if op == '^' or op == 'pow':
        return n1 ** n2

    raise Exception('Invalid operator "' + op + '"')


def eval(lst):
    if not isinstance(lst, list):
        raise Exception('Failed to evaluate "' + str(lst) + '"')
    if len(lst) == 2:
        op = lst[0]
        n = lst[1]
        if not isinstance(n, list):
            return calc(op, n)

        if isinstance(n, list):
            n = eval(n)

        return calc(op, n)
    elif len(lst) == 3:
        op = lst[0]
        n1 = lst[1]
        n2 = lst[2]
        if not isinstance(n1, list) and not isinstance(n2, list):
            return calc(op, n1, n2)
        
        if isinstance(n1, list):
            n1 = eval(n1)
        if isinstance(n2, list):
            n2 = eval(n2)

        return calc(op, n1, n2)
    else:
        raise Exception('Failed to evaluate "' + str(lst) + '"')

Tất cả bài học trong Dự án máy tính bằng Python

Tự luyện tập: Trình biên dịch Python online