Выражение — конструкция языка 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