Лутц М. - Изучаем Python (1077325), страница 32
Текст из файла (страница 32)
5.1) реализованы как тип 1оп9 в языке С (то есть имеют размер как минимум 32 бита), а вещественные числа в языке Ру1Ьоп реализованы как тип Ооп01е в языке С. Таким образом, точность представления чисел этих типов соответствует точности представления, которую обеспечивает компилятор языка С, использованный для сборки интерпретатора РуФЬоп.' Литералы длинных целых чисел Если числовой литерал заканчивается символом 1 или 1, он рассматривается интерпретатором РуФЬоп как длинное целое число (не надо путать с типом 1оп9 в языке С) и может использоваться для представления сколь угодно больших чисел. В Ру1Ьоп 2.2 и более поздних версиях целые числа автоматически преобразуются в длинные целые, если их значения не умещаются в отведенные 32 бита, поэтому вам не требуется вводить символ 1 — интерпретатор автоматически выполнит необходимые преобразования, когда потребуется увеличить точность представления.
Шестнадцатеричные и восьмеричные литералы Правила записи шестнадцатеричных (по основанию 16) и восьмеричных (по основанию 8) чисел в языке Ру1Ьоп ничем не отличаются от правил, используемых в языке С. Литералы восьмеричных чисел начинаются с нуля (0), вслед за которым следуют восьмеричные цифры 0-7. Шестнадцатеричные литералы начинаются с комбинации символов Ох или ОХ, вслед за которыми следуют шестнадцатеричные цифры 0-9 и А-Г. Шестнадцатеричные цифры в шестнадцатеричных литералах могут вводиться как в нижнем, так и в верхнем регистре. И восьмеричные, и шестнадцатеричные литералы создают объекты целых чисел — это всего лишь альтернативный синтаксис определения значений этого типа. Компленсные числа Литералы комплексных чисел в языке Ру1Ьоп записываются в формате вещественная часть+инимзя часть, где вещественная часть является необязательной и мниизя часть может указываться без вещественной составляющей.
Во внутреннем представлении комплексное число реализовано в виде двух чисел с плавающей точкой, но при обработке чисел этого типа используется математика комплексных чисел. Это замечание относится к стандартной реализации СРуьЬсп. В ауСЬоп чи- словые типы РуФЬоп в действительности соответствуют классам Оача.
145 Операторы выражений Встроенные числовые операции и расширения Помимо числовых литералов, которые приводятся в табл. 5.1, язык Ру$Ьоп предоставляет набор операций для работы с числовыми объектами: Оаераторьс выражений с, *, », * и другие.
Встроенные математические функции рою, ааа и другие. Вспомогательные модули гапбов, вата и другие. По мере продвижения мы встретимся со всеми этими компонентами. Наконец, если вам предстоит заниматься сложными математическими вычислениями, вы можете использовать специализированное расширение МитРу (Ышпег)с РуФЬоп), которое обеспечивает расширенные возможности при программировании математических вычислений, такие как матричный тип, обработка векторов и библиотеки для выполнения сложнейших математических вычислений. Группы программирования научных вычислений в таких организациях, как (аэггепсе 1айаегшоге и ХАБА, используют РуФЬоп с расширением ХпшРу для реализации разнообразных задач, которые раньше решались с помощью языков С++, УОГстйАЫ или Ма$1аЬ.
Из-за высокой сложности ХпшРу мы больше не будем говорить об этом расширении в данной книге. Дополнительные средства поддержки математических вычислений в языке РуФЬоп вы найдете на сайте Чап1$а о1 Рагпааапа или выполнив поиск в Сети.
Следует также заметить, что в настоящее время расширение ЫпшРу является дополнительным— оно не входит в состав пакета Ру$Ьоп и его необходимо устанавливать отдельно. В РусЬоп 3.0 типы целых чисел и длинных целых будут унифицированы. Таким образом, интерпретатор будет поддерживать единственный целочисленный тип — тип шт. Он будет поддерживать неограниченную точность представления, как это сейчас реализовано э длинных целых числах. В связи с этим большинство программистов заметят лишь незначительные изменения или вообще ничего не заметят.
Дополнительную информацию вы найдете в примечаниях к выпуску РусЬоп 3.0. Операторы выражений Пожалуй, самой фундаментальной возможностью обработки чисел являются выражения: комбинации чисел (или других объектов) и операторов, которые возвращают значения при выполнении интерпретатором Ру1Ьоп. Выражения в языке Ру1Ьоп записываются с использованием обычной математической нотации и символов операторов. Например, Глава 5. Числа сложение двух чисел Х и У производится с помощью выражения Х+ У, которое предписывает интерпретатору РуФ)уоп применить оператор ь к значениям с именами Х и У.
Результатом выражения Х + У будет дру- гой числовой объект. Таблица 5.2. Операторы выражений е языке Ру()гоп и правила определения старшинства Описание Операторы у>е1О х Генератор протокола передачи функции (по. явился в версии 2.5) Создает анонимную функцию 1азсса агре: ехргезтоп х >Г у Е1ЕЕ г Трехместный оператор выбора (появнлся в вер- сии 2.5) Логическая операция ИЛИ (значение у вычис- ляется, только если значение х ложно) х ог у Логический оператор И (значение у вычисляет- ся, только если значение х истинно) х апо у Логическое отрицание пес х Операторы сравнения, операторы равенства', операторы проверки идентичности объектов, операторы проверки вхождения в последова- тельность х < у, х <= у, х > у, х > = у, х == у, х <> у, х '= у, х 1з у, х !в по1 у, х 1п у, х по< >и у Битовая операция ИЛИ Битовая операция «исключающее ИЛИ» (ХОВ) Битовая операция И Сдвиг значения х влево илн вправо на у битов Сложение/конкатенация, вычитание х ) у х" у хьу х«у, х»у -х+у, х-у В версии Ру1Ьоп 2.5 неравенство значений можно проверить двумя способа- ми, как Х! = У или как Х <> У.
В РуФЬоп 3.0 последний вариант будет убран, как избыточный — используйте выражение Х! = У для проверки на неравенство. В табл. 5.2 приводится перечень всех операторов, имеющихся в языке Ру$)уоп. Многие из них достаточно понятны сами по себе, например обычные математические операторы (+, -, *, гг и т. д.). Некоторые будут знакомы тем, кто в прошлом использовал язык С: оператор Уг вычисляет остаток от деления, оператор «производит побитовый сдвиг влево, оператор 5 выполняет побитовую операцию и т. д. Другие операторы более характерны для языка Ру1)>оп, и не все имеют математическую природу. Например, оператор 1в проверяет идентичность объектов (это более строгая форма проверки на равенство), оператор 1аебов создает неименованные функции и т.
д. О большинстве из этих операторов мы еще будем говорить более подробно. 147 Операторы выражений Операторы Описание Умножение/повторение, остаток/Формат, де- ление" х ° у, х % у, х / у, х О у Унарный знак «минус», тождественность, би- товое дополнение, возведение в степень -х, +х, х, х ** у х[т), х[т'3), х,зттг, х( ( ),[..),[ Индексация, извлечение среза, уточнение имени, вызов функции Кортеж, список», словарь, преобразование в строку' Операция деления с округлением вниз (Х // т), впервые появившаяся в Ру()топ 2.2, всегда усекает дробную часть. Она будет описана в разделе «Деление: классическое, с округлением вниз и истинное». Начиная с версии РХФЬоп 2.0, с помощью синтаксиса списка ([... ]) можно определить либо литерал списка, либо генератор списков.
Последняя форма представления подразумевает выполнение цикла и сбор результатов в виде нового списка. Преобразование объектов в соответствующие им строки для вывода на экран также может быть выполнено с помощью более удобочитаемых функций зтг и терц котоРые будут описаны в разделе «»Рормать» отображения чисел» ниже, в этой же главе. Из-за неочевидности выражение 'Х ' планируется исключить из Ру(Ьоп 3.0, используйте вместо него герт( Х) . Смешанные операторы и определение старшинства операторов Как и в большинстве других языков программирования, в языке Ру- ([топ можно создавать сложные выражения, объединяя несколько опе- раторов из табл. 5.2 в одной инструкции.
Например, вычисление сум- мы двух произведений можно записать следующим образом: А*В С*0 Как в этом случае интерпретатор узнает, какие операторы должны выполняться в первую очередьу Ответ на этот вопрос заключается в старшинстве операторов. Когда интерпретатор Ру(акоп встречает выражение, содержащее более одного оператора, он делит его на отдельные части в соответствии с правилами старшинства и определяет порядок вычисления этих частей выражения. В табл. 5.2 чем выше приоритет оператора, тем ниже он находится в таблице и тем раньше он выполняется в смешанных выражениях. Например, если вы запишете выражение Х + У * 2, интерпретатор Ру()топ сначала выполнит умножение (т' * 7), а затем прибавит результат к значению Х, потому что оператор ° имеет более высокий приоритет (в табл.
5.2 он находится ниже), чем оператор +. Точно так же в первом примере этого раздела сначала будут найдены произведения (А * В и С * О), а затем будет выполнено сложение. Глава 5. Числа 148 Группировка подвыражений с помощью круглых скобок Вы можете навсегда забыть о старшинстве операторов, если будете группировать части выражений с помощью круглых скобок. Когда часть выражения заключается в круглые скобки, они отменяют правила старшинства операторов — РуФЬоп всегда в первую очередь вычисляет подвыражения в круглых скобках, а затем использует их результаты в объемлющем выражении.
Например, выражение Х ь У * 7 можно записать одним из следующих способов, чтобы вынудить Ру1Ьоп произвести вычисления в требуемом порядке: <Х+Х> -7 Х э (У . 7) В первом случае сначала будет выполнено сложение значений Х и У, потому что это подвыражение заключено в круглые скобки. Во втором случае первой будет выполнена операция умножения (точно так же, как если бы скобки вообще отсутствовали). Вообще говоря, использование круглых скобок в сложных выражениях можно только приветствовать — они не только определяют порядок выполнения вычислений, но и повышают удобочитаемость. Смешивание типов и их преобразование Помимо смешивания операторов вы можете также смешивать различные числовые типы.
Например, вы хотите найти сумму целого числа и числа с плавающей точкой: 40 + 3.14 Но это влечет за собой другой вопрос: какого типа будет результат— целое число или число с плавающей точнейше Ответ прост, особенно для тех, кто уже имеет опыт работы с любыми другими языками программирования: в выражениях, где участвуют значения различных типов, интерпретатор сначала выполняет преобразование типов операндов к типу самого сложного операнда, а потом применяет математику, специфичную для этого типа. Если вам уже приходилось использовать язык С, вы найдете, что такое поведение соответствует порядку преобразования типов в этом языке.