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]
Thử thách
Trung bìnhTạ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