Главная страница

справочник по Python. мм isbn 9785932861578 9 785932 861578


Скачать 4.21 Mb.
Названиемм isbn 9785932861578 9 785932 861578
Анкорсправочник по Python
Дата08.05.2022
Размер4.21 Mb.
Формат файлаpdf
Имя файлаBizli_Python-Podrobnyy-spravochnik.440222.pdf
ТипСправочник
#518195
страница25 из 82
1   ...   21   22   23   24   25   26   27   28   ...   82
Глава
14
.
Математика
В этой главе описываются модули, предназначенные для выполнения раз- личных видов математических операций. Дополнительно здесь описывает- ся модуль decimal, обеспечивающий обобщенную поддержку дробных деся- тичных чисел с плавающей точкой.
Модуль decimal
Тип данных float в языке Python представлен в виде чисел с плаваю-
Python представлен в виде чисел с плаваю- представлен в виде чисел с плаваю- щей точкой двойной точности (как определено стандартом IEEE 754).
Одна из особенностей этого формата состоит в том, что при его использо- вании невозможно точно представить десятичные дробные значения, та- кие как 0.1, так как в этом формате самым близким значением является
0.10000000000000001. Эта погрешность свойственна всем вычислениям, где участвуют числа с плавающей точкой, и иногда она может приводить к неожиданным результатам (например, выражение 3 * 0.1 == 0.3 возвра- щает значение False).
Модуль decimal предоставляет реализацию стандарта IBM General Decimal
Arithmetic Standard, который обеспечивает возможность точного пред- ставления дробных десятичных значений. Кроме того, он обеспечивает полный контроль над математической точностью, количеством значимых цифр и способом округления. Эти возможности могут пригодиться при ор- ганизации взаимодействий с внешними системами, в которых свойства дробных десятичных чисел определяются точно. Например, с помощью этого модуля можно создавать программы на языке Python, которые долж-
Python, которые долж-
, которые долж- ны взаимодействовать с бизнес-приложениями.
В модуле decimal объявляется два основных типа данных: тип Decimal, пред- ставляющий дробные десятичные числа, и тип Context, представляющий различные параметры, касающиеся вычислений, такие как точность и об- работка ошибок округления. Ниже приводится несколько простых приме- ров, иллюстрирующих основные приемы работы с модулем:

310
Глава 14. Математика import decimal x = decimal.Decimal(‘3.4’) # Создать несколько дробных десятичных чисел y = decimal.Decimal(‘4.5’)
ёё
# Выполнить некоторые вычисления, используя контекст по умолчанию a = x * y # a = decimal.Decimal(‘15.30’)
b = x / y # b = decimal.Decimal(‘0.7555555555555555555555555556’)
ёё
# Изменить точность и повторить вычисления decimal.getcontext().prec = 3
c = x * y # c = decimal.Decimal(‘15.3’)
d = x / y # d = decimal.Decimal(‘0.756’)
ёё
# Изменить точность только для одного блока инструкций with decimal.localcontext(decimal.Context(prec=10)):
e = x * y # e = decimal.Decimal(‘15.30’)
f = x / y # f = decimal.Decimal(‘0.7555555556’)
Объекты Decimal
Числа типа Decimal представлены следующим классом:
Decimal([value [, context]])
В аргументе value передается значение числа, которое может быть целым числом, строкой, содержащей значение дробного десятичного числа, такое как ‘4.5’, или кортежем (sign, digits, exponent). Если значение представ- лено кортежем, значение 0 в поле sign означает положительное число, 1 – отрицательное; в поле digits передается кортеж цифр в виде целых чисел и в поле exponent передается целочисленная экспонента. Для обозначения положительной или отрицательной бесконечности могут использоваться специальные строковые значения ‘Infinity’, ‘-Infinity’, а для обозначения
«не числа» (Not a Number, NaN) – строки ‘NaN’ и ‘sNaN’. Значение ‘sNaN’ – это разновидность значения «не числа», которая вызывает исключение при попытке использовать его в вычислениях. Обычный объект типа float не может использоваться в качестве начального значения, потому что это зна- чение может быть неточным (что идет вразрез с назначением обращения к типу decimal). В аргументе context передается объект класса Context, кото- рый будет описан ниже. Аргумент context определяет, что должно произой- ти, если начальное значение не является допустимым числом, – будет воз- буждено исключение или возвращено значение NaN.
Следующие примеры демонстрируют, как создавать различные дробные десятичные числа:
a = decimal.Decimal(42) # Создаст Decimal(“42”)
b = decimal.Decimal(“37.45”) # Создаст Decimal(“37.45”)
c = decimal.Decimal((1,(2,3,4,5),-2)) # Создаст Decimal(“-23.45”)
d = decimal.Decimal(“Infinity”)
e = decimal.Decimal(“NaN”)
Объекты Decimal относятся к разряду неизменяемых и обладают всеми обычными свойствами чисел встроенных типов int и float. Они могут так- же использоваться в качестве ключей словаря, помещаться в множества, сортироваться и так далее. В большинстве случаев манипулирование объ-

Модуль decimal
311
е ктами типа Decimal производится с помощью стандартных математиче- ских операторов языка Python. Помимо этого ниже представлены методы, которые могут использоваться для выполнения некоторых стандартных математических операций. Все методы принимают необязательный аргу- мент context, управляющий точностью, округлением и другими аспектами вычислений. Если этот аргумент опущен, используется текущий контекст.
Метод
Описание
x.exp([context])
Натуральная степень e ** d
x.fma(y, z [, context])
x * y + z
без округления результата x*y
x.ln([context])
Натуральный логарифм (по основанию e) числа x
x.log10([context])
Десятичный логарифм числа x
x.sqrt([context])
Корень квадратный из числа x
Объекты Context
Управление различными аспектами дробных десятичных чисел, такими как необходимость округления и точность, производится с помощью объ- екта типа Context:
Context(prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=
None, capitals=1)
Создает новый контекст для работы с дробными десятичными числами.
Параметры контекста должны определяться в виде именованных аргумен- тов с указанными именами. В аргументе prec передается целое число, опре- деляющее количество цифр после десятичной точки, аргумент rounding определяет порядок округления, а в аргументе traps передается список сигналов, которые возбуждают исключения в различных обстоятельствах
(например, при попытке выполнить деление на ноль). В аргументе flags передается список сигналов, свидетельствующих о начальном состоянии контекста (например, переполнение). Обычно аргумент flags не указывает- не указывает- указывает- указывает- ся. В аргументах Emin и Emax передаются целые числа, определяющие мини- передаются целые числа, определяющие мини- целые числа, определяющие мини- целые числа, определяющие мини- числа, определяющие мини- числа, определяющие мини-
, определяющие мини- определяющие мини- мини- мини- мальное и максимальное значения экспоненты соответственно. В аргумен- и максимальное значения экспоненты соответственно. В аргумен- и максимальное значения экспоненты соответственно. В аргумен- максимальное значения экспоненты соответственно. В аргумен- максимальное значения экспоненты соответственно. В аргумен- значения экспоненты соответственно. В аргумен- значения экспоненты соответственно. В аргумен- экспоненты соответственно. В аргумен- экспоненты соответственно. В аргумен- соответственно. В аргумен- оответственно. В аргумен-
. В аргумен-
В аргумен- те capitals передается логический флаг, указывающий, какой символ, ‘E’ или ‘e’, должен использоваться для обозначения экспоненты. По умолча- нию имеет значение 1 (‘E’).
Обычно новые объекты класса Context не создаются непосредственно. Для этого используются функция getcontext() или localcontext(), возвращаю- щая текущий объект Context. Затем этот объект изменяется в соответствии с требованиями. Примеры использования этих функций приводятся ниже в этом же разделе. Однако, чтобы лучше понять эти примеры, необходимо подробнее описать эти параметры контекста.
Порядок округления определяется аргументом rounding, который может иметь одно из следующих значений:

312
Глава 14. Математика
Константа
Описание
ROUND_CEILING
Округление в сторону положительной бесконечности. На- пример, число 2.52 будет округлено до 2.6, а число –2.58 – до –2.5.
ROUND_DOWN
Округление в сторону нуля. Например, число 2.58 будет округлено до 2.5, а число –2.58 – до -2.5.
ROUND_FLOOR
Округление в сторону отрицательной бесконечности. На- пример, число 2.52 будет округлено до 2.5, а число –2.58 – до –2.6.
ROUND_HALF_DOWN
Округление в сторону от нуля, если округляемая часть боль- ше половины последнего значимого разряда, в противном случае округление будет выполнено в сторону нуля. На- пример, число 2.58 будет округлено до 2.6, число 2.55 будет округлено до 2.5, а число –2.58 – до –2.6.
ROUND_HALF_EVEN
То же, что и ROUND_HALF_DOWN, только если округляемая часть равна точно половине последнего значимого разряда, ре- зультат округляется вниз, если предыдущая цифра четная, и вверх – если предыдущая цифра нечетная. Например, число 2.65 будет округлено до 2.6, число 2.55 также будет округлено до 2.6.
ROUND_HALF_UP
То же, что и ROUND_HALF_DOWN, только если округляемая часть равна точно половине последнего значимого разряда, результат округляется в сторону от нуля. Например, число
2.55 будет округлено до 2.6, а число –2.55 до –2.6.
ROUND_UP
Округление в сторону от нуля. Например, число 2.52 будет округлено до 2.6, а число –2.52 – до –2.6.
ROUND_05UP
Округление в сторону от нуля, если последний значимый разряд содержит цифру 0 или 5, в противном случае округ- ление выполняется в сторону нуля. Например, число 2.54 будет округлено до 2.6, число 2.64 также будет округлено до 2.6.
В аргументах traps и flags конструктору Context() передаются списки сиг- налов. Сигнал представляет тип арифметического исключения, которое может возникнуть в процессе вычислений. Если аргументы listed и traps опущены, все сигналы просто игнорируются. В противном случае возбуж- дается исключение. Возможные сигналы перечислены ниже:
Сигнал
Описание
Clamped
Экспонента была откорректирована в соответствии с допу- стимым диапазоном.
DivisionByZero
Деление небесконечного числа на 0.
Inexact
Погрешность округления.
InvalidOperation
Выполнена недопустимая операция.

Модуль decimal
313
Сигнал
Описание
Overflow
После округления экспонента превысила значение Emax.
Также генерирует сигналы Inexact и Rounded.
Rounded
Округление выполнено. Может появиться, если при окру- глении точность представления числа не пострадала (на- пример, при округлении «1.00» до «1.0»).
Subnormal
Перед округлением экспонента была меньше значения Emin.
Underflow
Потеря значащих разрядов числа. Результат операции был округлен до 0. Также генерирует сигналы Inexact и Subnormal.
Этим сигналам соответствуют исключения, которые могут использоваться для проверки на наличие ошибок. Например:
try:
x = a/b except decimal.DivisionByZero:
print “Деление на ноль”
Как и исключения, сигналы организованы в иерархию:
ArithmeticError (встроенное исключение)
DecimalException
Clamped
DivisionByZero
Inexact
Overflow
Underflow
InvalidOperation
Rounded
Overflow
Underflow
Subnormal
Underflow
Сигналы Overflow и Underflow присутствуют в этой иерархии в нескольких местах, потому что эти сигналы могут вызывать появление родительско- го сигнала (например, сигнал Underflow влечет за собой появление сигнала
Subnormal
). Кроме того, сигнал decimal.DivisionByZero является производным от встроенного исключения DivisionByZero.
Во многих случаях арифметические сигналы попросту игнорируются. На- пример, в процессе вычислений может возникать погрешность округле- ния, но не приводить к возбуждению исключения. Имена сигналов можно использовать для проверки флагов, указывающих на состояние вычисле- ний. Например:
ctxt = decimal.getcontext() # Получить текущий контекст x = a + b if ctxt.flags[Rounded]:
print “Результат был округлен!”

314
Глава 14. Математика
После установки флаги сохраняют свое состояние, пока не будет вызван метод clear_flags(). Благодаря этому можно выполнить целую серию вы- числений и проверить ошибки только в конце.
Значения параметров существующего объекта c типа Context можно полу- чить с помощью следующих атрибутов и методов:
c.capitals
Флаг может иметь значение 1 или 0 и определяет, какой символ, E или e, будет использоваться для обозначения экспоненты.
c.Emax
Целое число, определяющее максимальное значение экспоненты.
c.Emin
Целое число, определяющее минимальное значение экспоненты.
c.prec
Целое число, определяющее количество знаков после десятичной точки.
c.flags
Словарь, содержащий текущие значения флагов, соответствующих сигна- лам. Например, обращение к элементу c.flags[Rounded] вернет текущее зна- чение флага, соответствующего сигналу Rounded.
c.rounding
Действующее правило округления. Например ROUND_HALF_EVEN.
c.traps
Словарь, содержащий значения True/False, соответствующие сигналам, кото- рые должны вызывать исключения. Например, элемент c.traps[DivisionByZero] обычно имеет значение True, тогда как c.traps[Rounded] – False.
c.clear_flags()
Сбрасывает все флаги (очищает словарь c.flags).
c.copy()
Возвращает копию контекста c.
c.create_decimal(value)
Создает новый объект Decimal, используя контекст c. Это может пригодиться, когда потребуется создавать числа, точность представления и правила окру- гления для которых должны отличаться от установленных по умолчанию.
Функции и константы
В модуле decimal объявлены следующие функции и константы.
getcontext()
Возвращает текущий контекст дробных десятичных чисел. Каждый поток выполнения имеет свой собственный контекст, поэтому данная функция возвращает контекст для вызывающего потока выполнения.

Модуль decimal
315
localcontext([c])
Создает менеджера контекста, который устанавливает контекст c дробных десятичных чисел в качестве текущего для инструкций, находящихся в теле инструкции with. При вызове без аргумента создает копию текущего контекста. Ниже приводится пример использования этой функции, с по- мощью которой временно устанавливается точность до пяти знаков после десятичной точки для последовательности инструкций:
with localcontext() as c:
c.prec = 5
инструкции
setcontext(c)
Устанавливает контекст c дробных десятичных чисел в качестве текущего для вызывающего потока выполнения.
BasicContext
Предопределенный контекст с точностью до девяти знаков после десятич- ной точки. Использует правило округления ROUND_HALF_UP; параметр Emin имеет значение -999999999; параметр Emax имеет значение 999999999; раз- решены все сигналы, кроме Inexact, Rounded и Subnormal.
DefaultContext
Контекст по умолчанию, который используется при создании нового кон- текста (то есть значения параметров этого контекста используются как значения по умолчанию для параметров нового контекста). Определяет точность до 28 знаков после десятичной точки; округление ROUND_HALF_EVEN; включает флаги Overflow, InvalidOperation и DivisionByZero.
ExtendedContext
Предопределенный контекст с точностью до девяти знаков после десятич- ной точки. Использует правило округления ROUND_HALF_EVEN; параметр Emin имеет значение -999999999; параметр Emax имеет значение 999999999; все сигналы запрещены. Никогда не возбуждает исключения, но в результате операций может возвращаться значение NaN или Infinity.
Inf
То же, что и Decimal(“Infinity”).
negInf
То же, что и Decimal(“-Infinity”).
NaN
То же, что и Decimal(“NaN”).
Примеры
Ниже приводится несколько примеров, иллюстрирующих основы работы с дробными десятичными числами:
>>> a = Decimal(“42.5”)
>>> b = Decimal(“37.1”)

316
Глава 14. Математика
>>> a + b
Decimal(“79.6”)
>>> a / b
Decimal(“1.145552560646900269541778976”)
>>> divmod(a,b)
(Decimal(“1”), Decimal(“5.4”))
>>> max(a,b)
Decimal(“42.5”)
>>> c = [Decimal(“4.5”), Decimal(“3”), Decimal(“1.23e3”)]
>>> sum(c)
Decimal(“1237.5”)
>>> [10*x for x in c]
[Decimal(“45.0”), Decimal(“30”), Decimal(“1.230e4”)]
>>> float(a)
42.5
>>> str(a)
‘42.5’
Далее приводится пример изменения параметров контекста:
>>> getcontext().prec = 4
>>> a = Decimal(“3.4562384105”)
>>> a
Decimal(“3.4562384105”)
>>> b = Decimal(“5.6273833”)
>>> getcontext().flags[Rounded]
0
>>> a + b
9.084
>>> getcontext().flags[Rounded]
1
>>> a / Decimal(“0”)
Traceback (most recent call last):
File “”, line 1, in ?
decimal.DivisionByZero: x / 0
>>> getcontext().traps[DivisionByZero] = False
>>> a / Decimal(“0”)
Decimal(“Infinity”)
Примечания
• Объекты Decimal и Context обладают большим количеством методов, свя- занных с низкоуровневыми особенностями, которые имеют отношение к представлению и выполнению операций над дробными десятичными числами. Они не были описаны здесь, потому что знакомство с ними не является необходимым условием использования данного модуля в простых случаях. Однако вы сможете найти подробное их описание в электронной документации, по адресу: http://docs.python.org/library/
decimal.html
• Контекст дробных десятичных чисел является уникальным для каж- дого потока выполнения. Изменения в контексте будут оказывать влия- ние только в данном потоке, но не в других.

Модуль fractions
317
• Чтобы сигнализировать о появлении значения, не являющегося чис- лом, можно использовать специальное число Decimal(“sNaN”). Это число никогда не генерируется встроенными функциями. Однако если оно появится в вычислениях, будет выведено сообщение об ошибке. Его можно использовать, чтобы известить пользователя об ошибках, ког- да ошибочные вычисления должны быть прерваны и ошибки не могут быть проигнорированы. Например, функция, где возникла ошибка, мо- жет возвращать sNaN в качестве результата.
• Значение 0 может быть положительным или отрицательным (то есть
Decimal(0)
и Decimal(“-0”)). Однако при сравнивании эти значения по- прежнему считаются равными.
• Этот модуль, вероятно, мало подходит для программирования высоко- производительных научных вычислений из-за большого объема опе- раций, выполняемых в процессе вычислений. Кроме того, в подобных приложениях дробные десятичные числа имеют слишком мало пре- имуществ перед числами с плавающей точкой в двоичном формате.
• Подробное обсуждение форматов представления чисел с плавающей точкой и анализ ошибок выходит далеко за рамки данной книги. За дополнительными подробностями заинтересованным читателям следу- ет обратиться к книге по численному анализу. Кроме того, нелишним будет ознакомиться со статьей «What Every Computer Scientist Should
Know About Floating-Point Arithmetic» («Что должен знать каждый специалист в области вычислительных машин об арифметике с пла- вающей точкой») Дэвида Голдберга (David Goldberg), опубликованной в журнале «Computing Surveys», издательство Association for Comput-
Computing Surveys», издательство Association for Comput-
Surveys», издательство Association for Comput-
Surveys», издательство Association for Comput-
», издательство Association for Comput-
Association for Comput- for Comput- for Comput-
Comput-
Comput- ing Machinery, март 1991 года (эту статью легко отыскать в Интернете, поискав по заголовку).
1
• Спецификация «IBM General Decimal Arithmetic Specification» содер-
IBM General Decimal Arithmetic Specification» содер-
General Decimal Arithmetic Specification» содер-
General Decimal Arithmetic Specification» содер-
Decimal Arithmetic Specification» содер-
Decimal Arithmetic Specification» содер-
Arithmetic Specification» содер-
Arithmetic Specification» содер-
Specification» содер-
Specification» содер-
» содер- жит массу дополнительной информации и также легко может быть най- дена в Интернете с помощью поисковых систем.
Модуль fractions
Модуль fractions содержит определение класса Fraction, который являет- ся представлением рациональных чисел. Создать экземпляр класса можно с помощью конструктора, тремя разными способами:
Fraction([numerator [,denominator]])
Создает новое рациональное число. Числитель (numerator) и знаменатель
(denominator) являются целыми числами и по умолчанию принимаются равными 0 и 1 соответственно.
1
Перевода этой статьи на русский язык в Интернете нет, но можно порекомен- довать отличные статьи: http://www.vbstreets.ru/VB/Articles/66541.aspx и http://
www.ibm.com/developerworks/ru/library/j-jtp0114/.
Прим. перев.

318
Глава 14. Математика
Fraction(fraction)
Е
сли в аргументе fraction передается экземпляр numbers.Rational, создается новое рациональное число с тем же значением, что и fraction.
Fraction(s)
Если в аргументе s передается строка, содержащая дробь, такую как “3/7” или “-4/7”, создается дробь с теми же значениями числителя и знаменате- ля. Если в аргументе s передается строка с изображением дробного деся- тичного числа, например “1.25”, создается дробь, соответствующая этому значению (то есть Fraction(5,4)).
Ниже перечислены методы класса, которые могут использоваться для соз- дания экземпляров класса Fraction из объектов других типов:
Fraction.from_float(f)
Создает дробь, представляющую точное значение числа f с плавающей точ- кой.
Fraction.from_decimal(d)
Создает дробь, представляющую точное значение числа d типа Decimal.
Ниже приводится несколько примеров использования этих функций:
>>> f = fractions.Fraction(3,4)
>>> f
Fraction(3, 4)
>>> g = fractions.Fraction(“1.75”)
>>> g
Fraction(7, 4)
>>> h = fractions.Fraction.from_float(3.1415926)
Fraction(3537118815677477, 1125899906842624)
>>>
Экземпляр f класса Fraction поддерживает все обычные математиче- ские операции. Значения числителя и знаменателя хранятся в атрибутах
f.numerator и f.denominator соответственно. Кроме того, определены следую- щие методы:
f.limit_denominator([max_denominator])
Возвращает дробь, ближайшую к f. В аргументе max_denominator передается наибольший возможный числитель. По умолчанию используется значение
1000000.
Ниже приводится несколько примеров использования экземпляров класса
Fraction
(задействованы значения, созданные в предыдущем примере):
>>> f + g
Fraction(5, 2)
>>> f * g
Fraction(21, 16)
>>> h.limit_denominator(10)
Fraction(22, 7)
>>>

Модуль math
319
Кроме того, в модуле fractions определена единственная функция:
gcd(a, b)
Вычисляет наибольший общий делитель целых чисел a и b. Результат име- ет тот же знак, что и число b, если оно не равно нулю; и знак числа a – в про- тивном случае.
Модуль math
В модуле math определены следующие стандартные математические функ- ции. Эти функции оперируют целыми числами и числами с плавающей точкой, но они не будут работать с комплексными числами (для выполне- ний подобных операций над комплексными числами можно использовать отдельный модуль cmath). Все функции возвращают число с плавающей точкой. Все тригонометрические функции оперируют угловыми величина- ми, выраженными в радианах.
Функция
Описание
acos(
x)
Возвращает арккосинус числа x.
acosh(
x)
Возвращает гиперболический арккосинус числа x.
asin(
x)
Возвращает арксинус числа x.
asinh(
x)
Возвращает гиперболический арксинус числа x.
atan(
x)
Возвращает арктангенс числа x.
atan2(
y,x)
Возвращает арктангенс выражения (y
/
x
).
atanh(
x)
Возвращает гиперболический арктангенс числа x.
ceil(
x)
Возвращает округленное до наибольшего целого значение числа x.
copysign(
x,y)
Возвращает x с тем же знаком, что и y.
cos(
x)
Возвращает косинус числа x.
cosh(
x)
Возвращает гиперболический косинус числа x.
degrees(
x)
Преобразует число x радианов в градусы.
radians(
x)
Преобразует число x градусов в радианы.
exp(
x)
Возвращает e **
x.
fabs(
x)
Возвращает абсолютное значение x.
factorial(
x)
Возвращает факториал x.
floor(
x)
Возвращает округленное до наименьшего целого значение числа x.
fmod(
x,y)
Возвращает x % y, как вычисляет функция fmod() в языке C.
frexp(
x)
Возвращает положительное значение мантиссы и экспоненту числа x в виде кортежа.

320
Глава 14. Математика
Функция
Описание
fsum(
s)
Возвращает сумму значений с плавающей точкой в итерируе- мой последовательности s. Дополнительные подробности при- водятся в разделе «Примечания» ниже.
hypot(
x,y)
Возвращает эвклидово расстояние, sqrt(x * x + y * y).
isinf(
x)
Возвращает True, если x имеет значение бесконечности.
isnan(
x)
Возвращает True, если x имеет значение NaN.
ldexp(
x,i)
Возвращает x * (2 ** i).
log(
x [, base])
Возвращает логарифм числа x по основанию base. Если аргу- мент base опущен, вычисляется натуральный логарифм.
log10(
x)
Возвращает десятичный логарифм числа x.
log1p(
x)
Возвращает натуральный логарифм выражения x+1.
modf(
x)
Возвращает дробную и целую части числа x в виде кортежа.
Оба значения имеют тот же знак, что и число x.
pow(
x,y)
Возвращает x ** y.
sin(
x)
Возвращает синус числа x.
sinh(
x)
Возвращает гиперболический синус числа x.
sqrt(
x)
Возвращает квадратный корень числа x.
tan(
x)
Возвращает тангенс числа x.
tanh(
x)
Возвращает гиперболический тангенс числа x.
trunc(
x)
Усекает дробную часть числа x.
В модуле math определены следующие константы:
Константа
Описание
pi
Математическая константа – число π.
e
Математическая константа – число e.
Примечания
• Значения с плавающей точкой +inf, -inf и nan могут создаваться вызо- вом функции float() со строковым аргументом, например: float(“inf”), float(“-inf”)
или float(“nan”).
• Функция math.fsum() обеспечивает более высокую точность, чем встро- енная функция sum(), потому что в ней используется другой алгоритм, в котором предпринимается попытка избежать ошибок, обусловленных эффектом взаимного уничтожения. Возьмем в качестве примера по- следовательность s = [1, 1e100, -1e100]. Если попытаться вычислить сумму ее элементов вызовом функции sum(s), в результате будет полу-
(продолжение)

Модуль numbers
321
чено значение 0.0 (потому что значение 1 будет потеряно при сложении с большим числом 1e100). Однако вызов math.sum(s) вернет правильный результат 1.0. Алгоритм, используемый в функции math.fsum(), описы- вается в статье «Adaptive Precision Floating-Point Arithmetic and Fast
Robust Geometric Predicates» (Адаптивная точность в арифметике с плавающей точкой и быстрые устойчивые геометрические предикаты)
Джонатана Ричарда Шевчука (Jonathan Richard Shewchuk) в техниче-
Jonathan Richard Shewchuk) в техниче-
Richard Shewchuk) в техниче-
Richard Shewchuk) в техниче-
Shewchuk) в техниче-
Shewchuk) в техниче-
) в техниче- ском отчете колледжа информатики университета Карнеги-Меллона
(Carnegie Mellon University. School of Computer Science Technical Report)
CMU-CS-96-140, 1996.
Модуль numbers
В модуле numbers определено несколько абстрактных базовых классов, ко- торые могут использоваться для создания чисел различных типов. Число- вые классы организованы в иерархию, на каждом уровне которой последо- вательно добавляются дополнительные возможности.
Number
Класс, находящийся на вершине иерархии числовых классов.
Complex
Класс, представляющий комплексные числа. Числа этого вида состоят из действительной и мнимой частей и имеют атрибуты real и imag. Является производным от класса Number.
Real
Класс, представляющий вещественные числа. Является производным от класса Complex.
Rational
Класс, представляющий рациональные дроби. Числа этого вида состоят из числителя и знаменателя и имеют атрибуты numerator и denominator. Явля- ется производным от класса Real.
Integral
Класс, представляющий целые числа. Является производным от класса Ra- tional
Классы в этом модуле не предназначены для создания экземпляров. Их основная цель – обеспечить возможность проверки типов различных зна- чений. Например:
if isinstance(x, numbers.Number) # объект x является числом любого типа
инструкции
if isinstance(x, numbers.Integral) # объект x является целым числом
инструкции
Если какая-либо из этих проверок типа вернет True, это означает, что объ- ект x совместим со всеми математическими операциями, которые могут вы- полняться над числами данного типа, и может быть преобразован в один из встроенных типов, такой как complex(), float() или int().

322
Глава 14. Математика
Кроме того, абстрактные базовые классы могут использоваться в качестве базовых для пользовательских классов чисел. Такое наследование обеспе- чит не только возможность проверки типов, но и гарантирует реализацию всех обязательных методов. Например:
>>> class Foo(numbers.Real): pass
...
>>> f = Foo()
Traceback (most recent call last):
File “”, line 1, in
TypeError: Can’t instantiate abstract class Foo with abstract methods
(Перевод:
Трассировочная информация (самый последний вызов – самый нижний):
Файл “”, строка 1, в <модуль>
TypeError: Невозможно создать экземпляр абстрактного класса Foo с абстрактными методами
)
__abs__, __add__, __div__, __eq__, __float__, __floordiv__, __le__, __lt__,
__mod__, __mul__, __neg__, __pos__, __pow__, __radd__, __rdiv__, __rfloordiv__,
__rmod__, __rmul__, __rpow__, __rtruediv__, __truediv__, __trunc__
>>>
Примечания
• Подробнее об абстрактных базовых классах рассказывается в главе 7
«Классы и объектно-ориентированное программирование».
• Более подробную информацию об иерархии типов в этом модуле и их назначении можно найти в предложении по развитию Python (Python
Enhancement Proposal, PEP) PEP 3141 (http://www.python.org/dev/peps/
pep-3141
).
Модуль random
Модуль random предоставляет различные функции, генерирующие псевдо- случайные числа, а также функции, генерирующие псевдослучайные чис- ла в соответствии с различными законами распределения. Большая часть функций в этом модуле опирается на использование функции random(), ко- торая с помощью генератора «Вихрь Мерсенна» генерирует псевдослучай- ные числа, равномерно распределенные по диапазону [0.0, 1.0).
Инициализация
Следующие функции используются для управления состоянием генерато- ра случайных чисел:
seed([x])
Инициализирует генератор случайных чисел. При вызове без аргумен- та или со значением None в аргументе x генератор инициализируется зна- чением системного времени. В противном случае, если x является целым или длинным целым числом, используется значение x. Если аргумент x не является целым числом, он должен быть хешируемым объектом, а в каче-

Модуль random
323
стве инициализирующего значения будет использоваться результат вызова функции hash(x).
getstate()
Возвращает объект, представляющий текущее состояние генератора.
Позднее этот объект можно передать функции setstate(), чтобы восстано- вить состояние генератора.
setstate(state)
Восстанавливает состояние генератора случайных чисел из объекта, полу- ченного в результате вызова функции getstate().
jumpahead(n)
Быстро изменяет состояние генератора, как если бы функция random() была вызвана n раз подряд. Аргумент n должен быть целым неотрицательным числом.
Случайные целые числа
Следующие функции используются для получения случайных целых чи- сел.
getrandbits(k)
Создает длинное целое число, состоящее из k случайных битов.
randint(a,b)
Возвращает случайное целое число x в диапазоне a <= x <= b.
randrange(start,stop [,step])
Возвращает случайное целое число в диапазоне (start,stop,step). Не вклю- чая значение stop.
Случайные последовательности
Следующие функции используются для рандомизации последовательно- стей.
choice(seq)
Возвращает случайный элемент из непустой последовательности seq.
sample(s, len)
Возвращает последовательность длиной len, содержащую элементы по- следовательности s, выбранные случайным образом. Элементы в получив- шейся последовательности располагаются в том порядке, в каком они были отобраны.
shuffle(x [,random])
Случайным образом перемешивает элементы в списке x. В необязательном аргументе random передается функция генератора случайных чисел. Эта функция не должна принимать аргументов и должна возвращать число с плавающей точкой в диапазоне [0.0, 1.0).

324
Глава 14. Математика
Распределения случайных вещественных чисел
Следующие функции генерируют случайные вещественные числа. Имена параметров и названия законов распределения соответствуют стандарт- ным названиям, используемым в теории вероятностей и в математической статистике. За дополнительными подробностями вам следует обратиться к соответствующей литературе.
random()
Возвращает случайное число в диапазоне [0.0, 1.0).
uniform(a,b)
Равномерное распределение. Возвращает числа в диапазоне [a, b).
betavariate(alpha, beta)
Бета-распределение. Возвращает числа в диапазоне от 0 до 1. alpha > -1 и beta > -1.
cunifvariate(mean, arc)
Круговое равномерное распределение. В аргументе mean передается средний угол, а в аргументе arc – ширина диапазона распределения относительно среднего угла. Оба эти значения должны указываться в радианах, в диапа- зоне от 0 до pi. Возвращает значения в диапазоне (mean - arc/2, mean + arc/2).
expovariate(lambd)
Экспоненциальное распределение. В аргументе lambd передается значение, полученное делением 1.0 на желаемое среднее значение. Возвращает значе- значе- значе- ния в диапазоне [0, +Infinity).
gammavariate(alpha, beta)
Гамма-распределение. alpha > -1, beta > 0.
gauss(mu, sigma)
Гауссово распределение
1
со средним значением mu и стандартным отклоне- нием sigma. Выполняется немного быстрее, чем функция normalvariate().
lognormvariate(mu, sigma)
Логарифмически нормальное распределение, то есть нормальное распреде- ление логарифмов чисел, со средним значением mu и стандартным отклоне- нием sigma.
normalvariate(mu, sigma)
Нормальное распределение со средним значением mu и стандартным откло- нением sigma.
paretovariate(alpha)
Распределение Парето с параметром формы alpha.
1
Часто называют нормальным распределением. – Прим. перев.

Модуль random
325
triangular([low [, high [, mode]]])
Т
реугольное распределение на отрезке [low, high) с модальным значени- ем mode. По умолчанию аргумент low имеет значение 0, high – значение 1.0, а mode – значение посередине между low и high.
vonmisesvariate(mu, kappa)
Распределение фон Мизеса,
1
где mu – средний угол в радианах между 0 и 2 * pi
, а kappa – неотрицательный коэффициент концентрации. Если аргумент
kappa
имеет нулевое значение, распределение фон Мизеса вырождается до равномерного распределения угла в диапазоне от 0 до 2 * pi.
weibullvariate(alpha, beta)
Распределение Вейбулла с параметром масштабирования alpha и параме- тром формы beta.
Примечания
• Функции в этом модуле не предназначены для работы в многопоточных приложениях. В случае необходимости генерировать случайные числа в различных потоках выполнения следует использовать механизм бло- кировок, чтобы предотвратить одновременный доступ.
• Период генератора случайных чисел (длина последовательности чисел, прежде чем она начнет повторяться) составляет 2**19937–1.
• Случайные числа, генерируемые этим модулем, можно предсказать, и потому они не должны использоваться в криптографических алгорит- мах.
• Имеется возможность создавать новые генераторы случайных чисел за счет создания производных классов от random.Random и реализации ме- тодов random(), seed(), getstate(), setstate() и jumpahead(). Все остальные функции в этом модуле в действительности опираются на использова- ние методов класса Random. То есть к ним можно обращаться как к мето- дам экземпляра нового генератора случайных чисел.
• Модуль предоставляет два альтернативных класса генераторов случай- ных чисел – WichmannHill и SystemRandom. Чтобы использовать их, доста- точно создать экземпляр соответствующего класса и вызывать описан- ные выше функции, как методы. Класс WichmannHill реализует генератор
Уичмана-Хилла (Wichmann-Hill), который применялся в ранних верси-
Wichmann-Hill), который применялся в ранних верси-
-Hill), который применялся в ранних верси-
Hill), который применялся в ранних верси-
), который применялся в ранних верси- ях Python. Класс SystemRandom генерирует случайные числа, используя системный генератор случайных чисел os.urandom().
1
Иначе называемое круговым нормальным рассеиванием. – Прим. ред.

1   ...   21   22   23   24   25   26   27   28   ...   82


написать администратору сайта