Операторы и выражения
Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3
. Выражение можно разделить на операторы и операнды.
Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например +
, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2
и 3
– это операнды.
Операторы
Кратко рассмотрим операторы и их применение:
Обратите внимание, вычислить значения выражений, данных в примерах, можно также используя интерпретатор интерактивно. Например, для проверки выражения 2 + 3
воспользуйтесь интерактивной командной строкой интерпретатора Python:
>>> 2 + 3
5
>>> 3 * 5
15
>>>
Вот краткий обзор доступных операторов:
+
(сложение)- Суммирует два объекта
3 + 5
даст8
.'a' + 'b'
даст'ab'
.
-
(вычитание)- Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю.
-5.2
даст отрицательное число, а50 - 24
даст26
.
*
(умножение)- Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз.
2 * 3
даст6
.'la' * 3
даст'lalala'
.
**
(возведение в степень)- Возвращает число х, возведённое в степень y
3 ** 4
даст81
(т.е.3 * 3 * 3 * 3
)
/
(деление)- Возвращает частное от деления x на y
13 / 3
даст4.333333333333333
//
(целочисленное деление)- Разделить x на y и округлить ответ вниз до ближайшего целочисленного значения. Обратите внимание, что если одно из значений является float, вы получите обратно float.
13 // 3
даст4
-13 // 3
даст-5
9//1.81
даст4.0
%
(модуль)- Возвращает остаток от деления
13 % 3
даст1
.-25.5 % 2.25
даст1.5
.
<<
(сдвиг влево)- Сдвигает биты числа влево на заданное количество позиций. (Любое число в памяти компьютера представлено в виде битов - или двоичных чисел, т.е. 0 и 1)
2 << 2
даст8
. В двоичном виде2
представляет собой10
.- Сдвиг влево на 2 бита даёт
1000
, что в десятичном виде означает8
.
>>
(сдвиг вправо)- Сдвигает биты числа вправо на заданное число позиций.
11 >> 1
даст5
.- В двоичном виде
11
представляется как1011
, что будучи смещённым на 1 бит вправо, даёт101
, а это, в свою очередь, не что иное как десятичное5
.
&
(побитовое И)- Побитовая операция И над числами: если оба бита равны
1
, то результат равен1
. В противном случае -0
. 5 & 3
даст1
(0101 & 0011
даст0001
)
- Побитовая операция И над числами: если оба бита равны
|
(побитовое ИЛИ)- Побитовая операция ИЛИ над числами: если оба бита равны
0
, то результат равен0
. В противном случае -1
. 5 | 3
даст7
(0101 | 0011
даст0111
)
- Побитовая операция ИЛИ над числами: если оба бита равны
^
(побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ)- Побитовая операция ИСКЛЮЧАЮЩЕЕ ИЛИ: если оба бита (
1 или 0
) одинаковы, результатом будет0
. В противном случае -1
. 5 ^ 3
даст6
(O101 ^ 0011
даст0110
)
- Побитовая операция ИСКЛЮЧАЮЩЕЕ ИЛИ: если оба бита (
~
(побитовое НЕ)- Побитовая операция НЕ для числа x соответствует -(x+1)
~5
даст-6
. Более подробная информация на сайте http://stackoverflow.com/a/11810203
<
(меньше)- Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают
True
илиFalse
. Обратите внимание на заглавные буквы в этих словах. 5 < 3
дастFalse
и3 < 5
дастTrue
.- Можно составлять произвольные цепочки сравнений:
3 < 5 < 7
даётTrue
.
- Определяет, верно ли, что x меньше y. Все операторы сравнения возвращают
>
(больше)- Определяет, верно ли, что x больше y
5 > 3
даётTrue
. Если оба операнда - числа, то перед сравнением они оба преобразуются к одинаковому типу. В противном случае всегда возвращаетсяFalse
.
<=
(меньше или равно)- Определяет, верно ли, что x меньше или равно y
x = 3; y = 6; x <= y
даётTrue
>=
(больше или равно)- Определяет, верно ли, что x больше или равно y
x = 4; y = 3; x >= 3
даётTrue
==
(равно)- Проверяет, одинаковы ли объекты
x = 2; y = 2; x == y
даётTrue
x = 'str'; y = 'stR'; x == y
даётFalse
x = 'str'; y = 'str'; x == y
даётTrue
!=
(не равно)- Проверяет, верно ли, что объекты не равны
x = 2; y = 3; x != y
даётTrue
not
(логическое НЕ)- Если x равно
True
, оператор вернётFalse
. Если же x равноFalse
, получимTrue
. x = True; not x
даётFalse
.
- Если x равно
and
(логическое И)x and y
даётFalse
, если x равноFalse
, в противном случае возвращает значение yx = False; y = True; x and y
возвращаетFalse
, поскольку x равноFalse
. В этом случае Python не станет проверять значение y, так как уже знает, что левая часть выражения 'and' равняетсяFalse
, что подразумевает, что и всё выражение в целом будет равноFalse
, независимо от значений всех остальных операндов. Это называется укороченной оценкой булевых (логических) выражений.
or
(логическое ИЛИ)- Если x равно
True
, в результате получимTrue
, в противном случае получим значение y x = True; y = False; x or y
даётTrue
. Здесь также может производиться укороченная оценка выражений.
- Если x равно
Краткая запись мат. операций и присваивания
Зачастую результат проведения некой математической операции необходимо присвоить переменной, над которой эта операция производилась. Для этого существуют краткие формы записи выражений. Вы можете записать:
a = 2
a = a * 3
в виде:
a = 2
a *= 3
Обратите внимание, что выражения вида переменная = переменная операция выражение
принимает вид переменная операция = выражение
.
Порядок вычисления
Если имеется выражение вида 2 + 3 * 4
, что производится раньше: сложение или умножение? Школьный курс математики говорит нам, что умножение должно производиться в первую очередь. Это означает, что оператор умножения имеет более высокий приоритет, чем оператор сложения.
Следующая таблица показывает приоритет операторов в Python, начиная с самого низкого (самое слабое связывание) и до самого высокого (самое сильное связывание). Это означает, что в любом выражении Python сперва вычисляет операторы и выражения, расположенные внизу таблицы, а затем операторы выше по таблице.
Эта таблица взята из Справочника по языку Python (англ.) и приводится здесь для полноты описания. На практике лучше использовать скобки для группировки операторов и операндов, чтобы в явном виде указать порядок вычисления выражений. Заодно это облегчит чтение программы. Более подробно см. в разделе Изменение порядка вычисления ниже.
lambda
: Лямбда-выражениеif - else
: Условное выражениеor
: Логическое ИЛИand
: Логическое Иnot x
: Логическое НЕin, not in, is, is not, <, <=, >, >=, !=, ==
: Сравнения, включая тесты на принадлежность и тесты на идентичность|
: Побитовое ИЛИ^
: Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ&
: Побитовое И<<, >>
: Сдвиги+, -
: Сложение и вычитание*, /, //, %
: Умножение, деление, целочисленное деление и остаток от деления+x, -x, ~x
: Положительное, отрицательное, побитовое НЕ**
: Возведение в степеньx[index], x[index:index], x(arguments...), x.attribute
: Обращение по индексу, срез, вызов функции, ссылка на атрибут(expressions...), [expressions...], {key: value...}, {expressions...}
: Отображение связки или кортежа, отображение списка, отображение словаря, отображение множества
Операторы, о которых мы не упомянули, будут объяснены в дальнейших главах.
В этой таблице операторы с равным приоритетом расположены в одной строке. Например, +
и -
имеют равный приоритет.
Изменение порядка вычисления
Для облегчения чтения выражений можно использовать скобки. Например, 2 + (3 * 4)
определённо легче понять, чем 2 + 3 * 4
, которое требует знания приоритета операторов. Как и всё остальное, скобки нужно использовать разумно (не перестарайтесь) и избегать излишних, как в (2 + (3 * 4))
.
Есть ещё одно преимущество в использовании скобок – они дают возможность изменить порядок вычисления выражений. Например, если сложение необходимо произвести прежде умножения, можно записать нечто вроде (2 + 3) * 4
.
Ассоциативность
Операторы обычно обрабатываются слева направо. Это означает, что операторы с равным приоритетом будут обработаны по порядку от левого до правого. Например, 2 + 3 + 4
обрабатывается как (2 + 3) + 4
.
Выражения
Пример (сохраните как expression.py
):
length = 5
breadth = 2
area = length * breadth
print('Площадь равна', area)
print('Периметр равен', 2 * (length + breadth))
Вывод:
$ python expression.py
Площадь равна 10
Периметр равен 14
Как это работает
Длина и ширина прямоугольника хранятся в переменных length
и breadth
соответственно. Мы используем их для вычисления периметра и площади прямоугольника при помощи выражений. Результат выражения length * breadth
сохраняется в переменной area
, после чего выводится на экран функцией print
. Во втором случае мы напрямую подставляем значение выражения 2 * (length + breadth)
в функцию print
.
Также обратите внимание, как Python красиво печатает
результат. Несмотря на то, что мы не указали пробела между 'Площадь равна'
и переменной area
, Python подставляет его за нас, чтобы получить красивый и понятный вывод. Программа же остаётся при этом легкочитаемой (поскольку нам не нужно заботиться о пробелах между строками, которые мы выводим). Это пример того, как Python облегчает жизнь программисту.
Резюме
Мы увидели, как пользоваться операторами, операндами и выражениями. Это основные строительные блоки любой программы. Далее мы увидим, как это применить на практике.