Материалы по курсу «Основы программирования»

Выражения в языке 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.

>>> 2 ** 2 ** 3
256
>>> 2 ** (2 ** 3)
256
>>> (2 ** 2) ** 3
64

Рассмотрим таблицу приоритетов операций (операции перечислены в порядке убывания приоритета, операции с равным приоритетом находятся в одной строке таблицы):

Операторы Пояснение
[...], {...} Построение списков, словарей, множеств
f(...) Вызов функции
xs[...] Индексация списков, строк и т.д.
x.attr, x.f(...) Обращение к атрибуту, вызов метода
** Возведение в степень
~x Битовое отрицание
+x, -x Знак числа
*, /, %, // Операции умножения, деления, взятия остатка
+, - Сложение и вычитание
<<, >> Битовые сдвиги
& Битовое «И»
^ Битовое исключающее «ИЛИ»
| Битовое «ИЛИ»
in, not in, is, is not, Сравнение, принадлежность, тождественность
<, <=, >, >=, !=, ==  
not x Логическое отрицание
and Логическое «И»
or Логическое «ИЛИ»
lambda Лямбда-выражение (безымянная функция)
, Построение кортежей

Мы можем написать выражение

x + a**b * c > 7 or z - y == 5 and -xs[5] in ys

и ни разу не использовать скобки. Арифметические операции (которые вычисляют числа) имеют приоритет выше, чем операции отношения (>, ==, in), операции отношения имеют приоритет выше, чем логические операции.

Некоторые полезные операции

Обращение к атрибуту, вызов метода (x.a, x.f(...))

Python — объектно-ориентированный язык, т.е. поддерживает объекты — сущности, объединяющие в себе данные и операции над ними. Данные, которые хранятся в объектах, находятся в именованных ячейках, так называемых, атрибутах. Для обращения к атрибуту объекта используется запись

obj.attr

где obj — объект, а attr — имя атрибута.

Методы — это функции, связанные с объектами. Вызов метода выглядит так:

obj.func(‹аргументы›)

где obj — объект, func — имя метода.

Все типы данных в Python’е, в том числе и встроенные, являются объектами, многие полезные операции с ними вызываются как методы.

Целочисленное деление и взятие остатка

В Python’е числа могут быть целыми (типа int) и дробными (действительными, вещественными) (типа float). Внешне они отличаются наличием запятой или порядка степени (буквы e) в записи числа.

Пример. 100 — целое, 100.0 — дробное.

Операция деления / всегда порождает дробное число, даже если производится без остатка:

>>> 100 / 30
3.3333333333333
>>> 100 / 5
20.0

Для ряда задач нужна операция деления, которая даёт целое число. Она обозначается // — результатом всегда является целое, дробная часть отбрасывается:

>>> 100 // 30
3
>>> 100 // 3
33
>>> 100 // 5
20

Операция вычисления остатка обозначается как %:

>>> 100 % 30
10
>>> 100 % 3
1
>>> 100 % 5
0

Если меньшее делим на большее, то // даст ноль, а % даст делимое:

>>> 5 / 10
0.5
>>> 5 // 10
0
>>> 5 % 10
5

Операция запятая (,), она порождает кортеж

Кортеж (тип данных tuple) — неизменяемая структура данных, которая хранит в себе несколько значений, значения индексируются целыми числами начиная с 0. При выводе кортеж изображается как перечисление значений через запятую в круглых скобках

Пример. Создадим кортеж t3, состоящий из трёх чисел:

>>> t3 = 3, 7.5, 100500
>>> t3
(3, 7.5, 100500)
>>> t3[0]
3
>>> t3[1]
7.5
>>> t3[2]
100500

Распространённая ошибка — записать дробное число через запятую и случайно построить кортеж:

>>> 100 ** 0.5
10.0
>>> 100 ** 0,5
(1, 5)

Почему мы получили кортеж (1, 5)? Потому что нулевым элементом кортежа будет 100 ** 0 (любое число, кроме нуля, в нулевой степени — 1), первым элементом — число 5.

Запись

100 ** 0,5

идентична следующей (добавлены пробелы для наглядности):

100**0, 5

Ещё пример:

>>> 100 ** 0.5 + 1
11.0
>>> 100 ** 0,5 + 1
(1, 6)
>>> (100 ** 0.5) + 1
11.0
>>> (100 ** 0,5) + 1
ОШИБКА: нельзя сложить tuple и int