Отличия операторов от выражений
Читаю книгу Марка Лутца "Изучаем 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). Как отвёртка в ремонте: часть процесса, но не весь.
Лутц акцентирует, чтоб было понятно: код — инструкции с выражениями внутри, а выражения — операнды + операторы.
Оператор - это зарезервированное слово (+, -, >, 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'е переопределенного метода оператора.
Все остальное называется инструкциями - оно может не возвращать значения.
Извиняюсь за некропост, надеюсь, может быть полезно для осмысления.