Саммерфилд - Программирование на Python 3 (1077331), страница 17
Текст из файла (страница 17)
Функции в модуле ааСП не работают с комплексными числами. Это сделано преднамеренно, чтобы гарантировать, что пользователи модуля эаСП будут получать исключения вместо получения комплексных чисел в некоторых случаях. Если возникает необходимость использовать комплексные числа, можно воспользоваться модулем сэаСП, который содержит комплексные версии большинства тригонометрических и логарифмических функций, присутствующих в модуле ааСП, плюс ряд функций, специально предназначенных для работы с комплексными числами, таких как сааСП.рпаае(), сэаСП.ро1аг() и сзаСП. гесС(), а также константы сваСП, р1 и сваСП, е, которые хранят те же самые значения типа Г1саС, что и родственные им константы в модуле вас п. Числа типа Оесппа! Во многих приложениях недостаток точности, свойственный числам типа С1оаС, не имеет существенного значения, и эта неточность окупается скоростью вычислений.
Но в некоторых случаях предпочтение отдается точности, даже в обмен на снижение скорости работы. Модуль г)ессза! реализует неизменяемый числовой тип Оессза1, который представляет числа с задаваемой точностью. Вычисления с участием таких чисел производятся значительно медленнее, чем в случае использования значений типа Г1оаС, но насколько это важно, будет зависеть от приложения. Тип чисел с плавающей точкой вз Чтобы создать объект типа Оес1ва1, необходимо импортировать модуль бес(ва1.
Например: »»врьгс бес1ва! »> а = бес1ва1.0ес1ва1(9876) »> Ь = бес1ва1,0ес!ва!("54321.01234567898?654321") »> а+Ь Оеста1( ' 64197. 012345678987654327 ' ) Числа типа Оес1вз1 создаются с помощью функции бес7ва1. Оес1вз1(). Эта функция может принимать целочисленный или строковый аргумент, но не значение типа 71оас, потому что числа типа (1оз! не всегда имеют точное представление, а числа типа Оес1вз1 всегда представляются точно.
Если в качестве аргумента используется строка, она может содержать изображение числа как в обычной десятичной форме записи, так и в экспоненциальной. Кроме того, возможность явно определить точность представления числа бес7ва1. Оес(ва1 означает, что они надежно могут проверяться на равенство. Все арифметические операторы и функции, перечисленные в табл. 2.2 (стр. 74), включая соответствующие им комбинированные операторы присваивания, могут использоваться применительно к значениям типа бес1ва1.
Оес!ва1, но с некоторыми ограничениями. Если слева от оператора ** находится объект типа бес(ва!. Оес(ва1, то справа от оператора должно быть целое число. Точно так же, если первый аргумент функции ров() имеет тип бес(вз1. Оес(ва!, то второй и необязательный третий аргументы должны быть целыми числами. Модули взСЬ и рва!5 не могут использоваться для работы с числами типа бес(ва1. Оес1ва1, однако некоторые функции, присутствующие в модуле вз1Ь, реализованы как методы типа бес1ва1. Оес1ва1. Например, чтобы вычислить е", где х имеет тип (1оаг, вызывается функция ваСЬ.ехр(х), а когда х имеет тип бес)вз1, Оес(вз1, следует использовать метод х.
ехр( ) . Из обсуждения составляющей )>43 (стр. 34) мы можем видеть, что х. ехр() — это фактически разновидность записи бес1ва1. Оес(вз1. ехр(х). Кроме того, тип данных бес1ва1. Оес(ва! предоставляет метод 10(), который вычисляет натуральные (по основанию е) логарифмы (точно так же, как функция ва10.100() с одним аргументом), !о010() и ззг((), а также множество других методов, адаптированных для обработки значений типа бес1ва1. Оес1вз1. Значения типа бес1ва1. Оес(ва! работают в пределах контекста, где контекст — зто коллекция параметров настройки, определяющих поведение чисел бес1вз1.
Оес1ва1. Контекст определяет точность представления (по умолчанию 28 десятичных знаков), методику округления и некоторые другие особенности. В некоторых ситуациях различия в точности представления между типами (1081 и бес1вз1. Оес(вз1 становятся очевидными: 84 Глава 2. Типы данных »> 23 / 1.05 21.904761904761905 »> рг!от(23 / 1.05) 21.9047619048 »> рг!от(аае!ва1,0вства1(23) / Оаетва1.0ас!ва1("1.05")) 21.90476190476190476190476190 »> Оас!ва1.0оо!ва1(23) / Овс!ва1.0ее!ва1("1.05") 0ес!ва1('21.90476190476190476190476190') Хотя деление чисел бес!ва!.
Оества1 выполняется с более высокой точностью, чем деление чисел 11оат, в данном случае (в 32-битной системе) различия обнаруживаются только в пятнадцатом знаке после десятичной точки. Во многих ситуациях такая неточность не имеет большого значения, например, в этой книге, где во всех примерах с участием чисел с плавающей точкой используются числа типа 71оат.
С другой стороны, следует отметить, что последние два приведенных примера впервые демонстрируют, что печать объекта вызывает некоторое закулисное форматирование. Когда для вывода результата выражения Оее!ва1. 0ее!ва1(23)/Оес!ва1. 0ее!ва1("1. 05") вызывается функция ртп!(), выводится «голое» число — вывод имеет строковую форму. Если же просто вводится выражение, то на экран выводится бее!ва1,0ес!ва1 — в данном случае вывод имеет репрезентативную форму. Все объекты в языке Ру$Ъоп имеют две формы вывода. Строковая форма предназначена для вывода информации для человека. Репрезентативная форма является представлением объекта, которое можно передать интерпретатору Ру!Ъоп (если это необходимо) и воспроизвести представляемый объект.
Мы вернемся к этой теме в следующем разделе, когда будем обсуждать строки, и еще раз — в главе б, когда будем обсуждать вопросы реализации строковой и репрезентативной формы для наших собственных типов данных. Строки Строки в языке Ру6Ъоп представлены неизменяемым типом данных 81г, который хранит последовательность символов Юникода. Тип данных агг может вызываться как функция для создания строковых объектов — без аргументов возвращается пустая строка; с аргументом, который не является строкой, возвращается строковое представление аргумента; а в случае, когда аргумент является строкой, возвращается его копия.
Функция а!г() может также использоваться как функция преобразования. В этом случае первый аргумент должен быть стро- о Кодировки символов, стр. 112 В документе «Т 1Ъгагу Ве!егепсе» модуль Оее!ва1 описывается во всех подробностях, которые выходят далеко за рамки этой книги. Кроме того, там приводится множество примеров и список часто задаваемых вопросов с ответами на них. Строки 85 кой или объектом, который можно преобразовать в строку, а, кроме того, функции может быть передано до двух необязательных строковых аргументов, один из которых определяет используемую кодировку, а второй определяет порядок обработки ошибок кодирования. Ранее мы уже упоминали, что литералы строк создаются с использованием кавычек или апострофов, при этом важно, чтобы с обоих концов литерала использовались кавычки одного и того же типа.
В дополнение к этому мы можем использовать строки в тройнгых кавычках, то есть строки, которые начинаются и заканчиваются тремя символами кавычки (либо тремя кавычками, либо тремя апострофами). Например: техт = """Строки в тройных кавычках могут включать 'апострофы' и "кавычки" без лишних формальностей. Мы можем даже зкранировать символ перевода строки ~, благодаря чему данная конкретная строка будет занииать всего две строки.""" Если нам потребуется использовать кавычки в строке, это можно сделать без лишних формальностей — при условии, что они отличаются от кавычек, ограничивающих строку; в противном случае символы кавычек или апострофов внутри строки следует экранировать: а = 'Здесь 'апострофы' иожно не зкранировать, а т"кавычких," придется." О = 'Здесь т,'апострофыт' придется зкранировать, а "кавычки" не обязательно.' В языке Руф]топ символ перевода строки интерпретируется как завершающий символ инструкции, но не внутри круглых скобок (()), квадратных скобок ([]), фигурных скобок (()) и строк в тройных кавычках.
Символы перевода строки могут без лишних формальностей использоваться в строках в тройных кавычках, и мы можем включать символы перевода строки в любые строковые литералы с помощью экранированной последовательности т,п. Все экранированные последовательности, допустимые в языке Руф]топ, перечислены в табл. 2.6. В некоторых ситуациях, например, при записи регулярных выражений, приходится создавать строки с большим количеством символов обратного слеша.
(Регулярные выражения будут темой обсуждения главы 12.) Это может доставлять определенные неудобства, так как каждый такой символ придется экранировать: 1шрогт ге рпопет = ге.сошр11е(" ((?:[(]~Ч+[)])?~~в*'ЛО+(?:-'ЛО»)?)ф ) Решить эту проблему можно, используя «сь»расе» (тату) строки. Это обычные строки в кавычках или в тройных кавычках, в которые перед первой кавычкой добавлен символ г. Внутри таких строк все символы интерпретируются как обычные символы, поэтому отпадает необходимость экранировать символы, которые в других типах строк имеют специальное значение. Ниже приводится регулярное выражение для номера телефона в виде «сырой» строки: рпопе2 = ге.