Menu
Coddy logo textTech

Operator jednoargumentowy

Lekcja 10 z 29 w kursie Projekt kalkulatora w Python w Coddy.

Jak omówiliśmy w poprzedniej lekcji, możemy dodać obsługę operatora działającego na jednej liczbie, a nie na parze.

Oto kilka przykładów z eval:

  • eval(['-', 4])  ->  -4
  • eval(['+', 4, ['-', 4]])  ->  0
  • eval(['*', ['+', 4], ['-', 4]])  ->  -16
challenge icon

Wyzwanie

Łatwy

Dodaj obsługę operatora dla pojedynczej liczby w funkcji eval.

Spróbuj swoich sił

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):
    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)

Wszystkie lekcje w sekcji Projekt kalkulatora w Python

Poćwicz samodzielnie: Kompilator Python online