Menu
Coddy logo textTech

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

שיעור 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 אונליין