Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 44
Текст из файла (страница 44)
Результат вычисляется так, как если бы выражение включало скобки,как показано в комментарии.Кроме того, обратите внимание, что в первом выражении все числа являютсяцелыми, поэтому в версии 2.6 будут выполнены целочисленные операции деления и сложения, что даст в результате значение 5. В �������������������������Python������������������� 3.0 будет выполнена операция истинного деления и получен результат, как показано в примере.Если в версии 3.0 потребуется выполнить целочисленное деление, выражениеможно записать так: b // 2 + a (подробнее об операции деления рассказываетсячуть ниже).Во втором выражении круглые скобки окружают операцию сложения, чтобывынудить интерпретатор выполнить ее в первую очередь (то есть до операции /).Кроме того, один из операндов является вещественным числом, т. к.
в нем присутствует десятичная точка: 2.0. Вследствие такого смешения типов перед выполнением операции сложения Python преобразует целое число, на которое ссы-164Глава 5. Числалается имя a, в вещественное число (3.0). Если бы все числа в этом выражениибыли целыми, то операция целочисленного деления (4 / 5) в Python 2.6 вернулабы число 0, но в Python 3.0 она возвращает вещественное число 0.8 (подробнее обоперации деления рассказывается чуть ниже).Форматы отображения чиселОбратите внимание: в последнем примере была использована инструкцияprint.
Без этой инструкции результат мог бы показаться немного странным:>>> b / (2.0 + a)0.80000000000000004# Автоматический вывод: выводится большее число цифр>>> print(b / (2.0 + a)) # Инструкция print отбрасывает лишние цифры0.8Причина появления такого немного странного результата кроется в ограничениях аппаратных средств, реализующих вещественную математику, и в невозможности обеспечить точное представление некоторых значений. Обсуждениеаппаратной архитектуры компьютера выходит далеко за рамки этой книги,тем не менее, я замечу, что все цифры в первом результате действительно присутствуют в аппаратной части компьютера, выполняющей операции над числами с плавающей точкой, просто вы не привыкли видеть их. Я использовалэтот пример, чтобы продемонстрировать различия в форматах отображениячисел – при автоматическом выводе результатов в ходе интерактивного сеансаотображается больше цифр, чем при использовании инструкции print.
Если выне желаете, чтобы выводились лишние цифры, используйте инструкцию print.Во врезке «Форматы представления repr и str» на стр. 9 рассказывается, какдобиться более дружественного формата отображения результатов.Однако надо заметить, что не всегда значения отображаются с таким большимчислом цифр:>>> 1 / 2.00.5и что кроме применения функции print и автоматического вывода результатовсуществуют и другие способы отображения чисел:>>> num = 1 / 3.0>>> num# Автоматический вывод0.33333333333333331>>> print num# Инструкция print выполняет округление0.333333333333>>> “%e” % num# Вывод с использованием выражения форматирования строк‘3.333333e-001’>>> ‘%4.2f’ % num # Альтернативный формат представления вещественных чисел‘0.33’>>> ‘{0:4.2f}’.format(num) # Метод форматирования строк (Python 2.6 и 3.0)‘0.33’В последних трех случаях была использована операция форматированиястрок – инструмент, обладающий гибкой возможностью определять форматпредставления, но об этом мы поговорим в главе 7, когда займемся исследованием строк.
Результатом этой операции обычно являются строки, предназначенные для вывода.165Числа в действииФорматы представления repr и strC технической точки зрения различие между функцией автоматического вывода в интерактивной оболочке и инструкцией print соответствуетразличию между встроенными функциями repr и str:>>> num = 1 / 3>>> repr(num)# Используется для автоматического вывода: в форме как есть‘0.33333333333333331’>>> str(num) # Используется функцией print: дружественная форма‘0.333333333333’Обе функции преобразуют произвольные объекты в их строковое представление: repr (и функция автоматического вывода в интерактивнойоболочке) выводит результаты в том виде, в каком они были бы указаныв программном коде; str (и операция print) обычно выполняет преобразование значения в более дружественное представление.
Некоторые объекты имеют оба варианта строкового представления: str – для использования в обычных случаях и repr – для вывода в расширенном варианте.Эта идея еще всплывет далее, при обсуждении строк и возможности перегрузки операторов в классах, и тогда вы получите более полное представление об этих встроенных функциях.Помимо операции получения строкового представления произвольныхобъектов имя str так же является именем типа строковых данных и может вызываться с названием кодировки в качестве аргумента для преобразования строк байтов в строки Юникода.
Эту дополнительную особенность мы рассмотрим в главе 36.Операции сравнения: простые и составныеДо сих пор мы имели дело со стандартными числовыми операциями (такимикак сложение или умножение), но, кроме того, числа можно сравнивать. Обычные операторы сравнения действуют именно так, как и можно было бы ожидать, – они сравнивают значения операндов и возвращают логический результат (который, как правило, проверяется объемлющей инструкцией):>>> 1 <True>>> 2.0True>>> 2.0True>>> 2.0False2# Меньше чем>= 1# Больше или равно: число 1 преобразуется 1.0== 2.0 # Проверка на равенство значений!= 2.0 # Проверка на неравенство значенийОбратите внимание, смешивание разнотипных операндов допускается, толькоесли оба они принадлежат к числовым типам.
Во второй инструкции, в примере выше, интерпретатор выполняет сравнивание с позиции более сложноготипа, преобразуя целое число в вещественное.166Глава 5. ЧислаСамое интересное, что Python позволяет составлять цепочки из несколькихоператоров сравнения, для выполнения проверки на принадлежность диапазону значений. Цепочка операторов сравнения является, своего рода, сокращенной формой записи более длинных логических выражений. Проще говоря, ���Python позволяет объединить несколько операций сравнения, чтобы реализоватьпроверку на вхождение в диапазон значений. Выражение (A < B < C), например,проверяет, входит ли значение B в диапазон от A до C, и является эквивалентомлогическому выражению (A < B and B < C), но выглядит гораздо понятнее (и короче).
Например, допустим, что в программе имеются следующие инструкцииприсваивания:>>> X = 2>>> Y = 4>>> Z = 6Следующие два выражения дают совершенно идентичный результат, но первоеиз них короче и, вполне возможно, выполняется немного быстрее, потому чтоинтерпретатору приходится вычислять значение Y только один раз:>>> X < Y < Z # Составная операция сравнения: принадлежность диапазонуTrue>>> X < Y and Y < ZTrueТо же самое относится и к выражениям с ложным результатом; кроме того, допускается составлять цепочки произвольной длины:>>> XFalse>>> XFalse>>> 1True>>> 1False< Y > Z< Y and Y > Z< 2 < 3.0 < 4> 2 > 3.0 > 4В цепочках сравнений можно использовать и другие операторы сравнения.При этом получающиеся результаты могут на первый взгляд не иметь смысла,если не попытаться вычислить выражение тем же способом, как это делает интерпретатор Python.
Например, следующее выражение ложно уже потому, чточисло 1 не равно числу 2:>>> 1 == 2 < 3 # То же, что и: 1 == 2 and 2 < 3False# Но не то же самое, что и: False < 3 (что означает утверждение# 0 < 3, которое истинно)Интерпретатор не сравнивает значение False (результат операции 1 == 2) с числом 3 – с технической точки зрения это соответствовало бы выражению 0 < 3,которое должно было бы вернуть True (как мы увидим ниже, в этой же главе,True и False – это всего лишь числа 1 и 0, расширенные приписанными им свойствами).Деление: классическое, с округлением вниз и истинноеВ предыдущих разделах вы уже видели, как работает операция деления, и поэтому должны помнить, что в �����������������������������������������������Python����������������������������������������� 2.6 и 3.0 она действует по-разному. Фак-Числа в действии167тически существует три версии операции деления и два различных оператораделения, поведение одного из которых изменилось в версии 3.0:X/YКлассическое и истинное деление.
В Python 2.6 и в более ранних версияхэтот оператор выполняет операцию классического деления, когда дробнаячасть результата усекается при делении целых чисел и сохраняется приделении вещественных чисел. В ���������������������������������������Python��������������������������������� 3.0 этот оператор выполняет операцию истинного деления, которая всегда сохраняет дробную часть независимо от типов операндов.X // YДеление с округлением вниз.
Этот оператор впервые появился в Python 2.2и доступен в обеих версиях Python, 2.6 и 3.0. Он всегда отсекает дробнуючасть, округляя результат до ближайшего наименьшего целого независимоот типов операндов.Истинное деление было добавлено по той причине, что в текущей модели классического деления результаты зависят от типов операндов и с трудом могутбыть оценены заранее в языке программирования с динамической типизацией, каким является Python. Операция классического деления была ликвидирована в Python 3.0 из-за этого ограничения – в версии 3.0 операторы / и // реализуют истинное деление и деление с округлением вниз.Подводя итоги:•• В версии 3.0 оператор / всегда выполняет операцию истинного деления,возвращает вещественный результат, включающий дробную часть, независимо от типов операндов.