Операторы и выражения ===================== Большинство предложений (логических строк) в программах содержат *выражения*. Простой пример выражения: ``2 + 3``. Выражение можно разделить на операторы и операнды. *Операторы* -- это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например ``+``, или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются *операндами*. В нашем случае ``2`` и ``3`` -- это операнды. Операторы --------- Кратко рассмотрим операторы и их применение: Обратите внимание, вычислить значения выражений, данных в примерах, можно также используя интерпретатор интерактивно. Например, для проверки выражения ``2 + 3`` воспользуйтесь интерактивной командной строкой интерпретатора Python: .. sourcecode:: python >>> 2 + 3 5 >>> 3 * 5 15 **Операторы и их применение** +--------+-------------+---------------+---------------------------------------+ |Оператор| Название | Объяснение | Примеры | +--------+-------------+---------------+---------------------------------------+ | ``+`` | Сложение | Суммирует два | ``3 + 5`` даст ``8``; | | | | объекта | ``'a' + 'b'`` даст ``'ab'`` | +--------+-------------+---------------+---------------------------------------+ | ``-`` | Вычитание | Даёт разность | ``-5.2`` даст отрицательное число, | | | | двух чисел; | а ``50 - 24`` даст ``26``. | | | | если первый | | | | | операнд | | | | | отсутствует, | | | | | он считается | | | | | равным нулю | | +--------+-------------+---------------+---------------------------------------+ | ``*`` | Умножение | Даёт | ``2 * 3`` даст ``6``. | | | | произведение | ``'la' * 3`` даст ``'lalala'``. | | | | двух чисел или| | | | | возвращает | | | | | строку, | | | | | повторённую | | | | | заданное число| | | | | раз. | | +--------+-------------+---------------+---------------------------------------+ | ``**`` | Возведение | Возвращает | ``3 ** 4`` даст ``81`` | | | в степень | число ``х``, | (т.е. ``3 * 3 * 3 * 3``) | | | | возведённое в | | | | | степень ``y`` | | +--------+-------------+---------------+---------------------------------------+ | ``/`` | Деление | Возвращает | ``4 / 3`` даст ``1.3333333333333333``.| | | | частное от | | | | | деления ``x`` | | | | | на ``y`` | | +--------+-------------+---------------+---------------------------------------+ | ``//`` |Целочисленное|Возвращает | ``4 // 3`` даст ``1``. | | |деление |неполное | ``-4 // 3`` даст ``-2``. | | | |частное от | | | | |деления | | +--------+-------------+---------------+---------------------------------------+ | ``%`` |Деление по |Возвращает | ``8 % 3`` даст ``2``. | | |модулю |остаток от | ``-25.5 % 2.25`` даст ``1.5``. | | | |деления | | +--------+-------------+---------------+---------------------------------------+ | ``<<`` | Сдвиг влево |Сдвигает биты | ``2 << 2`` даст ``8``. | | | |числа влево на | В двоичном виде ``2`` представляет | | | |заданное | собой ``10``. Сдвиг влево на 2 бита | | | |количество | даёт ``1000``, что в десятичном | | | |позиций. (Любое| виде означает ``8``. | | | |число в памяти | | | | |компьютера | | | | |представлено в | | | | |виде битов - | | | | |или двоичных | | | | |чисел, т.е. | | | | |0 и 1) | | +--------+-------------+---------------+---------------------------------------+ | ``>>`` | Сдвиг вправо|Сдвигает биты | ``11 >> 1`` даст ``5``. | | | |числа вправо на| В двоичном виде ``11`` представляется | | | |заданное число | как ``1011``, что будучи смещённым на | | | |позиций. | 1 бит вправо, даёт ``101``, а это, в | | | | | свою очередь, не что иное как | | | | | десятичное ``5`` | +--------+-------------+---------------+---------------------------------------+ | ``&`` |Побитовое И |Побитовая | ``5 & 3`` даёт ``1``. | | | |операция И над | | | | |числами | | +--------+-------------+---------------+---------------------------------------+ | ``|`` |Побитовое ИЛИ|Побитовая | ``5 | 3`` даёт ``7`` | | | |операция ИЛИ | | | | |над числами | | +--------+-------------+---------------+---------------------------------------+ | ``^`` |Побитовое |Побитовая | ``5 ^ 3`` даёт ``6`` | | |ИСКЛЮЧИТЕЛЬНО|операция | | | |ИЛИ |ИСКЛЮЧИТЕЛЬНО | | | | |ИЛИ | | +--------+-------------+---------------+---------------------------------------+ | ``~`` |Побитовое НЕ |Побитовая | ``~5`` даёт ``-6``. | | | |операция НЕ для| | | | |числа ``x`` | | | | |соответствует | | | | |``-(x+1)`` | | +--------+-------------+---------------+---------------------------------------+ | ``<`` | Меньше |Определяет, |``5 < 3`` даст ``False``, | | | |верно ли, что | | | | |``x`` меньше |а ``3 < 5`` даст ``True``. | | | |``y``. Все | | | | |операторы |Можно составлять произвольные цепочки | | | |сравнения |сравнений: ``3 < 5 < 7`` даёт ``True``.| | | |возвращают | | | | |``True`` или | | | | |``False`` [1]_.| | | | |Обратите | | | | |внимание на | | | | |заглавные буквы| | | | |в этих словах. | | +--------+-------------+---------------+---------------------------------------+ | ``>`` | Больше |Определяет, | ``5 > 3`` даёт ``True``. | | | |верно ли, что | Если оба операнда - числа, то перед | | | |``x`` больше | сравнением они оба преобразуются к | | | |``y`` | одинаковому типу. В противном случае | | | | | всегда возвращается ``False``. | +--------+-------------+---------------+---------------------------------------+ | ``<=`` | Меньше или |Определяет, | ``x = 3; y = 6; x <= y`` даёт | | | равно |верно ли, что | ``True``. | | | |``x`` меньше | | | | |или равно ``y``| | +--------+-------------+---------------+---------------------------------------+ | ``>=`` | Больше или |Определяет, | ``x = 4; y = 3; x >= 3`` даёт | | | равно |верно ли, что | ``True``. | | | |``x`` больше | | | | |или равно ``y``| | +--------+-------------+---------------+---------------------------------------+ | ``==`` | Равно |Проверяет, | ``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`` | ``x = True; not x`` даёт ``False``. | | | |равно ``True``,| | | | |оператор вернёт| | | | |``False``. Если| | | | |же ``x`` равно | | | | |``False``, | | | | |получим | | | | |``True``. | | +--------+-------------+---------------+---------------------------------------+ | ``and``|Логическое И |``x and y`` |``x = False; y = True; x and y`` | | | |даёт ``False``,|возвращает ``False``, поскольку x равно| | | |если ``x`` |``False``. В этом случае Python не | | | |равно ``False``|станет проверять значение ``y``, так | | | |, в противном |как уже знает, что левая часть | | | |случае |выражения 'and' равняется ``False``, | | | |возвращает |что подразумевает, что и всё выражение | | | |значение ``y`` |в целом будет равно ``False``, | | | | |независимо от значений всех остальных | | | | |операндов. Это называется укороченной | | | | |оценкой булевых (логических) выражений.| +--------+-------------+---------------+---------------------------------------+ | ``or`` |Логическое |Если ``x`` |``x = True; y = False; x or y`` даёт | | |ИЛИ |равно ``True``,|``True``. Здесь также может | | | |в результате |производиться укороченная оценка | | | |получим |выражений. | | | |``True``, в | | | | |противном | | | | |случае получим | | | | |значение ``y`` | | +--------+-------------+---------------+---------------------------------------+ Краткая запись мат. операций и присваивания ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Зачастую результат проведения некой математической операции необходимо присвоить переменной, над которой эта операция производилась. Для этого существуют краткие формы записи выражений: Вы можете записать: .. sourcecode:: python a = 2; a = a * 3 в виде: .. sourcecode:: python a = 2; a *= 3 Обратите внимание, что выражения вида "``переменная = переменная операция выражение``" принимает вид "``переменная операция = выражение``". Порядок вычисления ------------------ Если имеется выражение вида ``2 + 3 * 4``, что производится раньше: сложение или умножение? Школьный курс математики говорит нам, что умножение должно производиться в первую очередь. Это означает, что оператор умножения имеет более высокий приоритет, чем оператор сложения. Следующая таблица показывает приоритет операторов в Python, начиная с самого низкого (самое слабое связывание) и до самого высокого (самое сильное связывание). Это означает, что в любом выражении Python сперва вычисляет операторы и выражения, расположенные внизу таблицы, а затем операторы выше по таблице. Эта таблица взята из `Справочника по языку Python (англ.) `_ и приводится здесь для полноты описания. На практике лучше использовать скобки для группировки операторов и операндов, чтобы в явном виде указать порядок вычисления выражений. Заодно это облегчит чтение программы. Более подробно см. в разделе :ref:`Изменение порядка вычисления ` ниже. **Приоритет операторов** +------------------------+----------------------------------+ | Оператор | Описание | +------------------------+----------------------------------+ | ``lambda`` | лямбда-выражение | +------------------------+----------------------------------+ | ``or`` | Логическое "ИЛИ" | +------------------------+----------------------------------+ | ``and`` | Логическое "И" | +------------------------+----------------------------------+ | ``not x`` | Логическое "НЕ" | +------------------------+----------------------------------+ | ``in``, ``not in`` | Проверка принадлежности | +------------------------+----------------------------------+ | ``is``, ``is not`` | Проверка тождественности | +------------------------+----------------------------------+ | ``<``, ``<=``, ``>``, | Сравнения | | ``>=``, ``!=``, ``==`` | | +------------------------+----------------------------------+ | ``|`` | Побитовое "ИЛИ" | +------------------------+----------------------------------+ | ``^`` | Побитовое "ИСКЛЮЧИТЕЛЬНО ИЛИ" | +------------------------+----------------------------------+ | ``&`` | Побитовое "И" | +------------------------+----------------------------------+ | ``<<``, ``>>`` | Сдвиги | +------------------------+----------------------------------+ | ``+``, ``-`` | Сложение и вычитание | +------------------------+----------------------------------+ | ``*``, ``/``, | Умножение, деление, целочисленное| | ``//``, ``%`` | деление и остаток от деления | +------------------------+----------------------------------+ | ``+x``, ``-x`` | Положительное, отрицательное | +------------------------+----------------------------------+ | ``~x`` | Побитовое НЕ | +------------------------+----------------------------------+ | ``**`` | Возведение в степень | +------------------------+----------------------------------+ | ``x.attribute`` | Ссылка на атрибут | +------------------------+----------------------------------+ | ``x[индекс]`` | Обращение по индексу | +------------------------+----------------------------------+ | ``x[индекс1:индекс2]`` | Вырезка | +------------------------+----------------------------------+ | ``f(аргументы ...)`` | Вызов функции | +------------------------+----------------------------------+ | ``(выражения, ...)`` | Связка или кортеж [2]_ | +------------------------+----------------------------------+ | ``[выражения, ...]`` | Список | +------------------------+----------------------------------+ | ``{ключ:данные, ...}`` | Словарь | +------------------------+----------------------------------+ Операторы, о которых мы не упомянули, будут объяснены в дальнейших главах. В этой таблице операторы с *равным приоритетом* расположены в одной строке. Например, ``+`` и ``-`` имеют равный приоритет. .. _changing-the-order-of-evaluation: Изменение порядка вычисления ---------------------------- Для облегчения чтения выражений можно использовать скобки. Например, ``2 + (3 * 4)`` определённо легче понять, чем ``2 + 3 * 4``, которое требует знания приоритета операторов. Как и всё остальное, скобки нужно использовать разумно (не перестарайтесь) и избегать излишних, как в ``(2 + (3 * 4))``. Есть ещё одно преимущество в использовании скобок -- они дают возможность изменить порядок вычисления выражений. Например, если сложение необходимо произвести прежде умножения, можно записать нечто вроде ``(2 + 3) * 4``. Ассоциативность --------------- Операторы обычно обрабатываются слева направо. Это означает, что операторы с равным приоритетом будут обработаны по порядку от левого до правого. Например, ``2 + 3 + 4`` обрабатывается как ``(2 + 3) + 4``. Выражения --------- Пример (сохраните как ``expression.py``): .. sourcecode:: python 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 облегчает жизнь программисту. Резюме ------ Мы увидели, как пользоваться операторами, операндами и выражениями. Это основные строительные блоки любой программы. Далее мы увидим, как это применить на практике. Примечания ---------- .. [1] "True" - *англ.* "Верно (Правда)"; "False" - *англ.* "Ошибочно (Ложь)". (*прим. перев.*) .. [2] "tuple" - *англ.* "кортеж" (*прим. перев.*)