Лутц М. - Изучаем Python (1077325), страница 35
Текст из файла (страница 35)
Прежде чем двинуться дальше, считаю своим долгом предупредить вас: будьте осторожны при использовании ведущего нуля в языке Ру- Х)хоп, если вы не предполагаете использование восьмеричных литералов. Интерпретатор Ру()Хоп будет воспринимать их как числа в восьмеричной системе счисления, что может не соответствовать вашим ожиданиям — число 010 всегда соответствует десятичному числу 8, а не десятичному 10 (независимо от того, что вы имели в виду!). 199 Числа в действии Другие встроенные средства для работы с числами »> Ьврогт аатп »> аа1п,рц аа1п.а (3. 1415926535897931, 2.
7182818284590451) № Распространенные константы »> ватЬ, а1п(2 ° аа1Ь. р1 / 180) 0.034899496702500969 № Синус, тангенс, косинус »> аатп.аагт(144), вата.асгг(2) (12.0, 1,4142135623730951) № Квадратный корень »> аЬа(-42), 2**4, роа(2, 4) (42, 16, 16) »> (пт(2.587), гоопб(2.567), гоопб(2.567, 2) № усенение, округление (2, 3.0, 2.5699999999999998) Как уже указывалось ранее, если в последнем случае использовать инструкцию ргтпт, мы получим результат (2, 3, О, 2. 57).
Обратите внимание, что встроенные модули, такие как вэтЬ, необходимо импортировать, а встроенные функции, такие как асв, доступны всегда, без выполнения операции импорта. Говоря другими словами, модули — это внешние компоненты, а встроенные функции постоянно располагаются в пространстве имен, которое используется интерпретатором Руб)топ по умолчанию для поиска имен, используемых программой. Это пространство имен соответствует модулю с именем 001171п .
В четвертой части книги мы подробнее поговорим о разрешении имен, а пока всякий раз, когда слышите слово «модуль», думайте: «импорт». Модуль гапбов из стандартной библиотеки также необходимо импортировать. Этот модуль предоставляет возможность получения случайных чисел с плавающей точкой в диапазоне от О до 1, случайных целых чисел в заданном диапазоне, случайного выбора элементов последовательности и многое другое: »> 1врогт гапбоа »> галсов. гапбоа() 0 49741978338014803 »> гапбов. гапбоа() 0 49354866439625611 »> галсов, гапб1п1( 1, 10) 5 »> гапбоа.
гапб1пт( 1, 10) 4 В дополнение к этим базовым типам объектов Рубйоп предоставляет встроенные функции и модули для работы с числами. Встроенные функции тпт и гсспб, например, усекают и округляют числа с плавающей точкой, соответственно. В следующем примере демонстрируется использование модуля ватп (который содержит реализацию множества функций из библиотеки ва(Ь языка С) и нескольких встроенных функций: 160 Глава 5.
Числа >» галопе.сло1се(['ЫГе оГ Вг1ап', 'Но1у Вга11', 'Нееп1пс оГ (1(е')) Ц>Ге о( Впал' »> галопе.сло1се(('Ыуе оГ Вг1еп', 'Но1у Вга11', 'Неап1пе оГ ((Ге')) 'Но1у Вга11' Модуль гапсоа может использоваться, например, для перемешивания колоды карт в игре, случайного выбора изображения в программе демонстрации слайдов, в программах статистического моделирования и т. д. За дополнительной информацией обращайтесь к руководству по стандартной библиотеке языка Ру1йоп. Другие числовые типы В этой главе мы рассматривали базовые числовые типы языка РуВЬоп— целые числа, длинные целые, числа с плавающей точкой и комплексные числа. Их вполне достаточно для решения математических задач, с которыми придется столкнуться большинству программистов.
Однако язык Ру$Ьоп содержит несколько более экзотических числовых типов, которые заслуживают того, чтобы коротко познакомиться с ними. Числа с фиксированной точностью В версии РуВЬоп 2.4 появился новый базовый числовой тип: числа с фиксированной точностью представления. Синтаксически такие числа создаются вызовом функции из импортируемого модуля и не имеют литерального представления. Функционально числа с фиксированной точностью напоминают числа с плавающей точкой, с фиксированным числом знаков после запятой, отсюда и название»числа с фиксированной точностью».
Например, с помощью таких чисел можно хранить значение, которое всегда будет иметь два знака после запятой. Кроме того, можно указать, как должны обрабатываться лишние десятичные цифры — усекаться или округляться. И хотя скорость работы с такими числами несколько ниже, чем с обычными числами с плавающей точкой, тем не менее тип чисел с фиксированной точностью идеально подходит для представления величин, имеющих фиксированную точность, таких как денежные суммы, и для достижения лучшей точности представления. Точность при работе с обычными вещественными числами несколько ниже. Например, результат следующего выражения должен быть равен нулю, но из-за недостаточного числа битов в представлении вещественных чисел страдает точность вычислений: »> 0.1 + 0.1 + 0.1 - 0.3 5.
5511151231257827е-017 Попытка вывести результат в более дружественной форме мало помогает, потому что проблема связана с ограниченной точностью представления вещественных чисел: 161 Другие числовые типы »> рг1лт О.т + О.т + О.т - О.з 5.55111512313е-017 Однако при использовании чисел с фиксированной точностью резуль- тат получается точным: »> Ггов Еес1ва1 1врогт Оес1ва1 »> Оес1ва1('0.1') + Оес1ва1('0.1') + Оесьва1('0,1') - Оес1вв1('0.3') Оес>ва1("0.0") Как показано в этом примере, числа с фиксированной точностью представления создаются вызовом функции конструктора Оес1ва) из модуля Оествз1, которому передается строка, содержащая желаемое число знаков после запятой. Когда в выражении участвуют числа с различной точностью представления, Ру1Ьоп автоматически выбирает наибольшую точность для представления результата: »> оес1ве1('О,т') 4 оес1веИ'0.40') + Оес1ве1('О.то') - оесгве1('0.30') Оества1("О.ОО") Другие инструменты модуля Оества1 позволяют задать точность представления всех таких чисел и многое другое.
Например, объект солтехт из этого модуля позволяет задавать точность (число знаков после запятой) и режим округления (вниз, вверх и т. д.): »> Оес1ва1.0ес1ве1(1) / Оес1ве1. Оес1ваЦ7) Оес>ва1("О, 1428571428571428571428571429" ) »> сес1ве1.9етсолТехс( ).ргео = 4 »> Сесгве1.0ес1ва1(т) / Сес1ва1.0ес1ва1(7) Оесьва1("0 1429") Поскольку тип чисел с фиксированной точностью достаточно редко используется на практике, за дополнительными подробностями я отсылаю вас к руководствам по стандартной библиотеке РуСЬоп. Множества В версии РуФЬоп 2.4 также появился новый тип коллекций — множест.
во. Поскольку этот тип является коллекцией других объектов, возможно, его обсуждение выходит за рамки этой главы. Но так как он поддерживает набор математических операций, мы познакомимся с основами его использования. Чтобы создать объект-множество, нужно передать последовательность или другой объект, поддерживающий возможность итераций по его содержимому, встроенной функции эет (похожая функция существовала в РуЬЬоп до версии 2.4 во внешнем модуле, но начиная с версии РуФЬоп 2.4 эта функция стала встроенной): »> х = ест('аЬсее') »> у = ест( Ьехуг ) Обратно функция возвращает объект множества, который содержит все элементы объекта, переданного функции (примечательно, что множест- 162 Глава 5.
Числа ва не предусматривают возможность определения позиций элементов, а кроме того, они не являются последовательностями): »> х зет(['а', 'с', 'Ь', 'е', 'О']) »> 'е' (п х Тгов Е Проверке вхохдения е иноиество »> х - у Е разнице инояеств зет(['а', 'с', 'е']) »> х [ у в Обьединвние иноиеств зе((['а', 'с', 'ь', 'е', 'о', 'у', 'х', 'е']) »> х а у Ф Пересечение иноявсте зет(['Ь', 'О']) Такие операции удобны при работе с большими множествами данных— пересечение двух множеств содержит объекты, которые присутствуют в обоих множествах, а объединение содержит все объекты из обоих множеств.
Ниже приводится более реальный пример применения операций над множествами — при работе со списками служащих гипотетической компании: »> епд[пеегв век(['Ьоэ', 'вое', 'апп', 'у[с']) »> аападегз зев(['соа', 'зое']) »> »> епд[пеегв а аападегв Ф Кто является и иниенерои, и иенедиерои одновреиенно> зет(['зце']) »> »> впдапвегз [ аападегз В Все, кто лринадлеиит к той или иной категории зет(['ч>с', чюе', 'тоа', 'ьоь', 'апп']) >» »> епдхпеегз — аападегз Ф Иниенери, которие не являются иенедиереии зет(['юс', 'ьоь', 'апп']) Кроме того, объект множества предоставляет метод, который реализует более экзотический набор операций.
Хотя операции над множествами в языке Ру([топ можно реализовать вручную (часто так и делалось в прошлом), встроенные операции над множествами обеспечивают высокую скорость выполнения стандартных операций, опираясь на эффективные алгоритмы и приемы реализации. За дополнительной информацией по множествам обращайтесь к руко. водству по стандартной библиотеке языка РуЬ]ьоп. Множества, созданные таким способом, поддерживают обычные математические операции над множествами посредством операторов.
Обратите внимание: эти операции не могут выполняться над простыми последовательностями — чтобы использовать их, нам требуется создать из них множества: 1бЗ Другие числовые типы о В версии Ру()топ 3.0 предлагается форма записи литералов [1, 2, 3), которая дает тот же эффект, который имеет вызов функции ее)[[1, 2, 31) и тем самым предоставляет еще один способ создания объекта множества, Однако это — будущее расширение языка, поэтому за более подробной информацией обращайтесь к примечаниям к выпуску 3.0. Логические значения Иногда утверждается, что логический тип Ьоо1 в языке Ру$)топ по своей природе является числовым, потому что два его значения Тгсе и гз1зе— это всего лишь целые числа 1 и О, вывод которых настроен особым образом.