>>>> 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 является стандартным модулем (