Menu
CoddyTech

אופרטורים בסיסיים

שיעור 12 מתוך 29 בקורס פרויקט מחשבון באמצעות Python של Coddy.

השלב הבא הוא לבנות את המבנה של הרשימה למבנה הבסיסי שלנו.

נבחן את החישוב 1 + 2 + 3. תחילה נהפוך אותו לרשימה - [1, '+', 2, '+', 3] ואז נבנה ממנו מבנה בעזרת struct בצורה שהפונקציה eval מקבלת - ['+',  ['+', 1, 2], 3].

בשלב הזה חשוב לנו רק לבנות את הרשימה במבנה שהפונקציה eval מקבלת.

דוגמאות:

  • [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

אתגר

בינוני

צרו את הפונקציה struct שמקבלת רשימה בפורמט שלמעלה ומחזירה את הפורמט המתאים לפונקציה eval.

בשלב זה יש לטפל רק באופרטורים הבסיסיים '+' ו-'-'.

נסו בעצמכם

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

כל השיעורים ביחידה פרויקט מחשבון באמצעות Python

תרגלו בעצמכם: קומפיילר Python אונליין