Выражения в языке Python
Выражение — конструкция языка Python, порождающая некоторое значение, которое можно, например, присвоить переменной. Иначе говоря, выражение — это запись некоторой формулы.
- Операнды — запись некоторых значений в программе: константы, переменные, некоторые другие выражения.
- Операции — знаки, которые каким-либо образом вычисляют из одного или двух значений (операндов) новое значение.
У операторов есть приоритет и ассоциативность. Приоритет задаёт порядок связывания нескольких знаков операций, расположенных «рядом». Ассоциативность — порядок вычислений (слева направо или справа налево) для операций с равным приоритетом.
Например, приоритет у умножения выше, чем приоритет у сложения. Таким образом, запись a + b * c будет трактоваться как a + (b * c) , т.е. сначала свяжутся b и c при помощи знака * , затем a и подвыражение b * c при помощи + .
Левая ассоциативность означает, что в выражении a + b — c + d операции + и — будут выполняться слева направо: ((a + b) — c) + d .
Правая ассоциативность — наоборот. Единственная операция в Python, имеющая правую ассоциативность — возведение в степень. Выражение 2 ** 2 ** 3 трактуется как 2 ** (2 ** 3) , а не (2 ** 2) ** 3 .
Рассмотрим таблицу приоритетов операций (операции перечислены в порядке убывания приоритета, операции с равным приоритетом находятся в одной строке таблицы):
Мы можем написать выражение
и ни разу не использовать скобки. Арифметические операции (которые вычисляют числа) имеют приоритет выше, чем операции отношения ( > , == , in ), операции отношения имеют приоритет выше, чем логические операции.
Некоторые полезные операции
Обращение к атрибуту, вызов метода ( x.a , x.f(. ) )
Python — объектно-ориентированный язык, т.е. поддерживает объекты — сущности, объединяющие в себе данные и операции над ними. Данные, которые хранятся в объектах, находятся в именованных ячейках, так называемых, атрибутах. Для обращения к атрибуту объекта используется запись
где obj — объект, а attr — имя атрибута.
Методы — это функции, связанные с объектами. Вызов метода выглядит так:
где obj — объект, func — имя метода.
Все типы данных в Python’е, в том числе и встроенные, являются объектами, многие полезные операции с ними вызываются как методы.
Целочисленное деление и взятие остатка
В Python’е числа могут быть целыми (типа int ) и дробными (действительными, вещественными) (типа float ). Внешне они отличаются наличием запятой или порядка степени (буквы e ) в записи числа.
Пример. 100 — целое, 100.0 — дробное.
Операция деления / всегда порождает дробное число, даже если производится без остатка:
Для ряда задач нужна операция деления, которая даёт целое число. Она обозначается // — результатом всегда является целое, дробная часть отбрасывается:
Операция вычисления остатка обозначается как % :
Если меньшее делим на большее, то // даст ноль, а % даст делимое:
Операция запятая ( , ), она порождает кортеж
Кортеж (тип данных tuple ) — неизменяемая структура данных, которая хранит в себе несколько значений, значения индексируются целыми числами начиная с 0 . При выводе кортеж изображается как перечисление значений через запятую в круглых скобках
Пример. Создадим кортеж t3 , состоящий из трёх чисел:
Распространённая ошибка — записать дробное число через запятую и случайно построить кортеж:
Почему мы получили кортеж (1, 5) ? Потому что нулевым элементом кортежа будет 100 ** 0 (любое число, кроме нуля, в нулевой степени — 1), первым элементом — число 5 .
Целочисленная арифметика¶
Специальный символ, выполняющий арифметические вычисления. В выражении a * b символ * — оператор умножения, a и b — его операнды.
Оператор, принимающий два операнда, называется бинарным. Унарный оператор принимает один операнд. Пример унарного оператора: -1 .
Последовательность операторов и операндов, результат вычисления которой сводится к единственному значению. Простейшие выражения состоят из одного значения и не содержат операторов: 42 , "Hello, World!" . Пример более сложного выражения: 2 ** 32 — 1 .
Свойство оператора, влияющее на очередность его выполнения в выражении с несколькими различными операторами при отсутствии явного (с помощью скобок) указания на порядок их вычисления.
Например, результат выражения 2 + 2 * 2 — 6, поскольку приоритет операции умножения выше, чем приоритет операции сложения. Изменить порядок вычислений в выражении можно с помощью скобок:
последовательность выполнения операций (или направление вычисления), реализуемая когда операции имеют одинаковый приоритет и отсутствует явное (с помощью скобок) указание на очерёдность их выполнения.
Различают правую (справа налево) и левую (слева направо) ассоциативность. Пример оператора с левой ассоциативностью — оператор деления / . Так, выражение 8 // 4 // 2 эквивалентно (8 // 4) // 2 и его результат равен 1.
Пример оператора с правой ассоциативностью — оператор возведения в степень:
Арифметические операторы¶
В таблице приведены некоторые арифметические операторы языка Python в порядке уменьшения приоритета (операторы с наибольшим приоритетом расположены выше).
Возведение в степень
Унарные плюс и минус
Сложение и вычитание
Целочисленное деление и взятие остатка от деления¶
Рассмотрим выражение \(7 / 2\) . Частное можно записать в виде десятичной дроби: \(3.5\) . Однако в ряде задач нам нужны отдельно целая часть и остаток от деления. Очевино, целая часть результата равна \(3\) . Тогда для вычисления остатка от \(7\) нужно отнять произведение целой части на делимое, т.е. остаток равен \(7 — 3 \cdot 2\) .
Такие операции поддерживаются в Python напрямую. Так, для целочисленного деления используется оператор // , а для получения остатка от деления оператор % :
Эти операции полезны при вычислениях с отдельными разрядами чисел.
Пусть дано число \(8192\) , и нам необходимо получить его третий разряд, т.е. единицу. \(8192 // 10^2 \% 10 = 8192 // 100 \% 10 = 81 \% 10 = 1\) .
Функции перевода чисел в различные системы счисления¶
Функции принимают целое число и возвращают его строковое представление в двоичной, восьмеричной и шестнадцатеричной системах счисления соответственно.
С этой функцией мы познакомились на прошлом занятии. Сейчас дополним, что вторым аргументом она может принимать основание системы счисления, в которой записано число x :
Задачи¶
Дано целое десятичное число. Выведите его последнюю цифру.
Дано целое десятичное число. Найдите число десятков в его десятичной записи.
Дано трехзначное число. Найдите сумму его цифр.
Пирожок в столовой стоит \(a\) рублей и \(b\) копеек. Определите, сколько рублей и копеек нужно заплатить за \(n\) пирожков.
Приложение запрашивает у пользователя стоимость одного пирожка и количество пирожков. Пример:
Приложение должно вычислить стоимость запрошенного количества пирожков. Пример вывода:
Дано число \(n\) . С начала суток прошло n минут. Определите, сколько часов и минут будут показывать электронные часы в этот момент. Программа должна вывести два числа: количество часов (от 0 до 23) и количество минут (от 0 до 59). Учтите, что число \(n\) может быть больше, чем количество минут в сутках.
Дополнительные задачи¶
В школе решили набрать три новых математических класса. Так как занятия по математике у них проходят в одно и то же время, было решено выделить кабинет для каждого класса и купить в них новые парты. За каждой партой может сидеть не больше двух учеников. Известно количество учащихся в каждом из трёх классов. Сколько всего нужно закупить парт чтобы их хватило на всех учеников? Программа получает на вход три целых десятичных числа: количество учащихся в каждом из трех классов.
Обувная фабрика собирается начать выпуск элитной модели ботинок. Дырочки для шнуровки будут расположены в два ряда, расстояние между рядами равно \(a\) , а расстояние между дырочками в ряду \(b\) . Количество дырочек в каждом ряду равно \(N\) . Шнуровка должна происходить элитным способом «наверх, по горизонтали в другой ряд, наверх, по горизонтали и т.д.» (см. рисунок). Кроме того, чтобы шнурки можно было завязать элитным бантиком, длина свободного конца шнурка должна быть \(l\) . Какова должна быть длина шнурка для этих ботинок?
Программа получает на вход четыре натуральных числа \(a\) , \(b\) , \(l\) и \(N\) и должна вывести одно число — искомую длину шнурка.
3. Занятия в школе начинаются в 9:00. Продолжительность урока — 45 минут, перемены — 10 минут. На вход принимается номер урока, а выводится время, в которое он заканчивается (часы и минуты отдельно). Пример вывода:
4. Доработайте код задачи № 3 таким образом, чтобы он запрашивал время начала занятий (минуты и часы отдельно) и номер урока, а далее также рассчитывал время окончания уроков.
5. Пользователь вводит число и систему счисления этого числа. Программа переводит число в десятичную, двоичную, восьмеричную и шестнадцетеричную системы счисления с использованием стандартных функций. Пример вывода:
Домашнее задание¶
Дано трехзначное число. Найти произведение его цифр.
Даны значения двух моментов времени, принадлежащих одним и тем же суткам: часы, минуты и секунды для каждого из моментов времени. Известно, что второй момент времени наступил не раньше первого. Определите, сколько секунд прошло между двумя моментами времени.
Операторы и выражения¶
Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3 . Выражение можно разделить на операторы и операнды.
Операторы — это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например + , или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 — это операнды.
Операторы¶
Кратко рассмотрим операторы и их применение:
Обратите внимание, вычислить значения выражений, данных в примерах, можно также используя интерпретатор интерактивно. Например, для проверки выражения 2 + 3 воспользуйтесь интерактивной командной строкой интерпретатора Python:
Операторы и их применение
Краткая запись математических операций и присваивания¶
Зачастую результат проведения некой математической операции необходимо присвоить переменной, над которой эта операция производилась. Для этого существуют краткие формы записи выражений:
Вы можете записать:
Обратите внимание, что выражения вида » переменная = переменная операция выражение » принимает вид » переменная операция = выражение «.
Порядок вычисления¶
Если имеется выражение вида 2 + 3 * 4 , что производится раньше: сложение или умножение? Школьный курс математики говорит нам, что умножение должно производиться в первую очередь. Это означает, что оператор умножения имеет более высокий приоритет, чем оператор сложения.
Следующая таблица показывает приоритет операторов в Python, начиная с самого низкого (самое слабое связывание) и до самого высокого (самое сильное связывание). Это означает, что в любом выражении Python сперва вычисляет операторы и выражения, расположенные внизу таблицы, а затем операторы выше по таблице.
Эта таблица взята из Справочника по языку Python (англ.) и приводится здесь для полноты описания. На практике лучше использовать скобки для группировки операторов и операндов, чтобы в явном виде указать порядок вычисления выражений. Заодно это облегчит чтение программы. Более подробно см. в разделе Изменение порядка вычисления ниже.
Приоритет операторов
Операторы, о которых мы не упомянули, будут объяснены в дальнейших главах.
В этой таблице операторы с равным приоритетом расположены в одной строке. Например, + и — имеют равный приоритет.
Изменение порядка вычисления¶
Для облегчения чтения выражений можно использовать скобки. Например, 2 + (3 * 4) определённо легче понять, чем 2 + 3 * 4 , которое требует знания приоритета операторов. Как и всё остальное, скобки нужно использовать разумно (не перестарайтесь) и избегать излишних, как в (2 + (3 * 4)) .
Есть ещё одно преимущество в использовании скобок — они дают возможность изменить порядок вычисления выражений. Например, если сложение необходимо произвести прежде умножения, можно записать нечто вроде (2 + 3) * 4 .
Ассоциативность¶
Операторы обычно обрабатываются слева направо. Это означает, что операторы с равным приоритетом будут обработаны по порядку от левого до правого. Например, 2 + 3 + 4 обрабатывается как (2 + 3) + 4 .
Выражения¶
Пример (сохраните как expression.py ):
Вывод:
Как это работает:
Длина и ширина прямоугольника хранятся в переменных length и breadth соответственно. Мы используем их для вычисления периметра и площади прямоугольника при помощи выражений. Результат выражения length * breadth сохраняется в переменной area , после чего выводится на экран функцией print . Во втором случае мы напрямую подставляем значение выражения 2 * (length + breadth) в функцию print .
Также обратите внимание, как Python «красиво печатает» результат. Несмотря на то, что мы не указали пробела между ‘Площадь равна’ и переменной area , Python подставляет его за нас, чтобы получить красивый и понятный вывод. Программа же остаётся при этом легкочитаемой (поскольку нам не нужно заботиться о пробелах между строками, которые мы выводим). Это пример того, как Python облегчает жизнь программисту.
Резюме¶
Мы увидели, как пользоваться операторами, операндами и выражениями. Это основные строительные блоки любой программы. Далее мы увидим, как это применить на практике.
«True» — англ. «Верно (Правда)»; «False» — англ. «Ошибочно (Ложь)». (прим. перев.) ↩
Приоритет операций
В языках программирования и в математике вычисление выражений производится в определенном порядке. Порядок этот задается приоритетом операторов и скобками. Со школы мы знаем, что умножение имеет более высокий приоритет, чем сложение, поэтому в пределах одних скобок сначала будет выполнено умножение, а затем только сложение:
Рассмотрим таблицу приоритета операций в языке Python. Сверху таблицы самые приоритетные операции, снизу – операции с низким приоритетом.
Как видно, скобки самые главные. Скобки решают все.
Если в одном выражении идут операторы одинакового приоритета, то вычисления выполняются слева направо.
Исключение составляет оператор **. Он право-ассоциативный. Т.е. в цепочке из двух ** сначала выполнится правый, а потом левый.
Обратите внимание на приоритеты not, and и or.
Правила хорошего тона: не составляйте очень сложных выражений и логических выражений; всегда разбивайте их на части. Даже если вы прекрасно знаете приоритеты операций, то программист, читающий ваш код после вас, может знать их плохо; поэтому НЕ пренебрегайте скобками.
В случае с операторами сравнения, помните про цепочки сравнений!
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈