Menu
CoddyTech

Toán tử cấp một

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

Như mình đã thảo luận trước đó, trong toán học có thứ tự ưu tiên.

Các toán tử '*', '/' và '%' được tính trước '+' và '-'.

Trong khóa học này, mình gọi các toán tử '*', '/' và '%' là toán tử cấp một.

Còn các toán tử '+' và '-' là toán tử cấp hai.

challenge icon

Thử thách

Dễ

Hiện tại, struct chỉ hỗ trợ các toán tử cấp hai.

Nhiệm vụ của bạn là bổ sung hỗ trợ các toán tử cấp một cho struct.

Hãy đảm bảo thứ tự tính toán được thực hiện đúng!

Ví dụ:

  • struct([3, '*', 2])  ->  ['*', 3, 2]
  • struct([1, '+', 2, 'mul', 3])  ->  ['+', 1, ['mul', 2, 3]]
  • struct([2, 'mod', 3, '-', 4, '/', 5.2])  ->  ['-', ['mod', 2, 3], ['/', 4, 5.2]]

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) + '"')


OPERATORS = ['+', '-', 'add', 'sub']
def struct(lst):
    i = 0
    while i < len(lst):
        if lst[i] in OPERATORS:
            if len(lst) == 3:
                return [lst[i], lst[i - 1], lst[i + 1]]
            temp = lst[:i - 1]
            temp.append([lst[i], lst[i - 1], lst[i + 1]])
            temp += lst[i + 2:]
            lst = temp
        else:
            i += 1
    return 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