Простой Python. Современный стиль программирования (Любанович) - страница 254

>>>> from decimal import Decimal

>>>> price = Decimal('19.99')

>>>> tax = Decimal('0.06')

>>>> total = price + (price * tax)

>>>> total

>Decimal('21.1894')

Мы записали цену и налог как строковые значения, чтобы сохранить их точность. При вычислении переменной total мы обработали все значащие части цента, но хотим получить ближайшее целое значение цента:

>>>> penny = Decimal('0.01')

>>>> total.quantize(penny)

>Decimal('21.19')

Такие же результаты можно получить с помощью старых добрых чисел с плавающей точкой и округлений, но не всегда. Вы можете умножить сумму на 100 и использовать при подсчетах количество центов, но и при таком подходе можете пострадать. Этот вопрос обсуждается на сайте www.itmaybeahack.com.

Выполняем вычисления для рациональных чисел с помощью модуля fractions

Вы можете представлять числа как числитель, разделенный на знаменатель, с помощью модуля стандартной библиотеки fractions (http://docs.python.org/3/library/fractions.html). Рассмотрим пример простой операции умножения 1/3 на 2/3:

>>>> from fractions import Fraction

>>>> Fraction(1,··3) * Fraction(2, 3)

>Fraction(2, 9)

Аргументы с плавающей точкой могут быть неточными, поэтому вы можете использовать модуль Decimal вместе с модулем Fraction:

>>>> Fraction(1.0/3.0)

>Fraction(6004799503160661, 18014398509481984)

>>>> Fraction(Decimal('1.0')/Decimal('3.0'))

>Fraction(3333333333333333333333333333, 10000000000000000000000000000)

Получим наибольший общий делитель для двух чисел с помощью функции gcd:

>>>> import fractions

>>>> fractions.gcd(24, 16)

>8

Используем Packed Sequences с помощью array

В Python список больше похож на связанный список, а не на массив. Если вы хотите получить одномерную последовательность элементов одинакового типа, применяйте тип array (http://docs.python.org/3/library/array.html). Переменные этого типа используют меньше места и поддерживают многие методы работы со списками. Создайте массив с помощью команды вида array (код типа, инициализатор). Код типа указывает на тип данных (вроде int или float), и опциональный инициализатор содержит исходные значения, которые можно передать как список, строку или итерируемое значение.

Я никогда не использовал этот пакет для решения задач. Это низкоуровневая структура данных, полезная для представления чего-то вроде изображений. Если для выполнения числовых подсчетов вам на самом деле нужен массив, особенно имеющий больше одного измерения, лучше воспользоваться NumPy, который мы рассмотрим через пару разделов.

Обработка простой статистики с помощью модуля statistics

Начиная с версии Python 3.4, statistics является стандартным модулем (