Отличия операторов от выражений

Читаю книгу Марка Лутца "Изучаем Python. Том 1". И там отдельное внимание отводится отличию выражений от операторов, которое я так и не понял. Можете объяснить в чем заключается отличие и дать несколько примеров?


Ответы (2 шт):

Автор решения: Питер Пэйн

Выражение — это кусок кода, который Python "вычисляет" и возвращает значение (число, строку, True/False). Оно всегда "даёт результат". Выражения — это "математика" или "логика" в коде, они состоят из значений (операндов) и операторов.

Что это на практике: Выражения — всё, что можно "посчитать": 1+2, len("hello"), x > 5. Они возвращают значение, которое можно присвоить, напечатать или использовать в другом выражении.

Операторы — это "отвёртки" или "калькуляторы" внутри выражений: они берут операнды (значения) и выполняют действие (+ складывает, > сравнивает).

Операторы — часть выражений, но не сами выражения. Лутц подчёркивает: выражения — "вся формула" (1+2), оператор — только "+" (инструмент).

Что это на практике: Операторы — символы/слова вроде +, ==, and, in. Они "склеивают" операнды в выражение.

Почему Лутц отличает от выражений: Операторы — "кирпичики" выражений, но выражение — это полная "формула" с результатом. Без операндов оператор бесполезен.

Итак.

Инструкции (statements): "Сделай задачу" — выполняют действия, не возвращают значение (if, for, =). Как тикет: "Перезагрузи сервер".

Выражения (expressions): "Посчитай результат" — вычисляют и возвращают значение (1+2, x>5). Как расчёт внутри тикета: "downtime = end - start".

Операторы (operators): "Инструмент для расчёта" — символы в выражениях (+, >, and). Как отвёртка в ремонте: часть процесса, но не весь.

Лутц акцентирует, чтоб было понятно: код — инструкции с выражениями внутри, а выражения — операнды + операторы.

→ Ссылка
Автор решения: Kseniya Sinickaya

Оператор - это зарезервированное слово (+, -, >, and), в python операторы переопределяются от типа с помощью зарезервированных функций (__add__, __eq__, ...). В некоторых языках не проводится четкого различия между операторами и функциями, но операторы на то и операторы, что возвращают что-то, кроме пустоты или None (Python), во всяком случае - это хорошая практика.

Можно переопределить оператор во многих языках, чтобы он вернул пустоту так, но это очень плохо и может использоваться только как костыль (не придумала для чего):

Python:

def __add__(self, other): # Этот метод реализует оператор +
    self.value += other.value
    # Метод не возвращает ничего (т.е. возвращает None)

С++ (можно так сделать, но это ограничит использование):

// Оператор +=, который возвращает void
void operator+=(const Number& other) {
    value += other.value;
    // Ничего не возвращаем
}

Кстати, оператор инкремента возвращает значение, например в С#, можно записать так:

int i = 1;
int k = i++ + (i += 3) + 1;

Выражение может включать вызов операторов, функций, вызов лямбда выражения типа функций (с возвращаемым значением - не bool и не пустота) или типа predicate (с возвращаемым значением типа bool), но не типа action (возвращает пустоту), объекты любых делегатов, НО не инициализацию переменных и ничего, что в результате выполнения НЕ выдаст значение, то есть: Вот объявление функции:

def sum(a, b):
    return a + b

и делегатов функций:

sum = lambda a, b: a + b

Это НЕ выражения, так как мы НЕ сможем сделать так:

a = 1 + def sum(a, b):
    return a + b

или так:

a = 1 + lambda a, b: a + b

НО мы можем сделать так:

i = 1 + sum(1, 3)

1 + sum(1, 3) - это выражение, i = 1 + sum(1, 3) - это НЕ выражение, НО i == 1 + sum(1, 3) - это выражение, sum(1, 3) - это выражение (так как это вызов функции)

Интересный случай выражения с объектом делегата: Выражение "sum" - это объект делегата:

sum = lambda a, b: a + b

Можно написать так:

my_sum = sum
my_sum1 = sum

А потом можно написать такое выражение, например, в инструкции if:

my_sum == my_sum1

Или так:

i: int = id(my_sum)

То есть выражение может состоять из комбинации операторов и всего, что может вернуть значение.

Из выражений, как и из операторов всегда можно составить выражения, но из выражений нельзя составить оператор, можно оператор только ПЕРЕОПРЕДЕЛИТЬ с помощью выражения в return'е переопределенного метода оператора.

Все остальное называется инструкциями - оно может не возвращать значения.

Извиняюсь за некропост, надеюсь, может быть полезно для осмысления.

→ Ссылка