Операторы и выражения
Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 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даст-59//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даётTruex = 'str'; y = 'stR'; x == yдаётFalsex = '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 облегчает жизнь программисту.
Резюме
Мы увидели, как пользоваться операторами, операндами и выражениями. Это основные строительные блоки любой программы. Далее мы увидим, как это применить на практике.